2012-01-18 142 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