2012-01-18 144 views
6

T-SQL XML查詢這是命名空間

T-Sql xml query

一個跟進的問題,如果我添加一個命名空間的XML數據,沒有再次返回。

DECLARE @xVar XML 
SET @xVar = 
    '<ReportData ObjectId="123" xmlns="http://ait.com/reportdata"> 
    <ReportId>AAAA-BBBB-CCCCC-DDDDD</ReportId> 
    <DocId>100</DocId> 
    <ReportName>Drag Scraper Troubleshooting</ReportName> 
    <DocType>Name</DocType> 
    <StatusId>1</StatusId> 
    <AuthorId>1</AuthorId> 
    </ReportData>' 

SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 

上述查詢不返回任何內容。其次,我將如何選擇單個選擇中的所有元素,並返回一個所有元素都作爲字段的行?

我想回到構造爲記錄如下:

ReportId    | DocId | ReportName | 
AAAA-BBBB-CCCCC-DDDDD | 100 | AAAA-BBBB-CCCCC-DDDDD | 
+0

你能改寫也許這個問題有點?假設您有多個ReportData元素,您希望將這些元素作爲單獨的列返回?我是否正確地假設? – FarligOpptreden 2012-01-18 12:27:30

+0

修改了我的問題,希望它有幫助 – klashagelqvist 2012-01-18 12:39:07

+1

甚至沒有投票給我有效的貢獻? :( – FarligOpptreden 2012-01-18 12:56:37

回答

8

WITH XMLNAMESPACES

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata') 
SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 
+0

再次感謝那些對最終版本感興趣的人們:WITH XMLNAMESPACES(DEFAULT'http://ait.com/reportdata') SELECT [ReportId] = repor tdata.item.value('./ ReportId [1]','varchar(40)'), [DocId] = reportdata.item.value('./ DocId [1]','varchar(40)') 從@ xVar.nodes('/ ReportData')AS reportdata(item)。我希望我能讚揚她的兩個答案,但不知道你能做到這一點 – klashagelqvist 2012-01-18 12:53:00

1

如果我的假設是正確的,要列出所有ReportData元素在XML文檔中,並希望自己的子元素不同的欄目,你可以看是這樣的:

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata') 
SELECT 
    [ReportId] = reportdata.item.value('(./ReportId)[1]', 'varchar(40)') 
    , [DocId] = reportdata.item.value('(./DocId)[1]', 'varchar(40)') 
    , [ReportName] = reportdata.item.value('(./ReportName)[1]', 'varchar(40)') 
    , [DocType] = reportdata.item.value('(./DocType)[1]', 'varchar(40)') 
    , [StatusId] = reportdata.item.value('(./StatusId)[1]', 'varchar(40)') 
    , [AuthorId] = reportdata.item.value('(./AuthorId)[1]', 'varchar(40)') 
FROM @xVar.nodes('//ReportData') AS reportdata(item) 

我需要看看清理命名空間聲明一點,但它似乎爲我工作...

編輯:修改我的答案與馬丁建議WITH XMLNAMESPACES子句。 :)

+0

感謝,也適用於我。如果我們只能擺脫那些討厭的命名空間陳述 – klashagelqvist 2012-01-18 12:38:38

+0

我看到有一個WITH XMLNAMESPACES語句,但我似乎無法讓它工作 – klashagelqvist 2012-01-18 12:41:47

+0

@ user1071785 - 呃,我的回答是(?) – 2012-01-18 12:45:24