2017-06-12 79 views
0

我从其中一列以XML格式获取数据。该列称为“更新”,表为“审计”。该领域是这样的:尝试从SQL Server获取XML字段

<Fields><Field Name="DateFrom"/><Field Name = "Type 1"/><Field Name = "Type 2/></Fields> 

    <Fields><Field Name = "DateFrom"/></Fields> 

    <Fields><Field Name="DateFrom"/><Field Name = "Note"/><Field Name = "Type 1"/></Fields> 

的XML领域是一个更大的查询的一部分:

Select id, Updated 
    from Audit 

最终会看起来像下文中,ID是一个非XML列。

ID  Updated 

123 DateFrom, Type1, Type2 
323 DateFrom 
455 DateFrom, Note, Type1 

我试过一些我在网上找到的东西,但我没有正确地做到这一点。我尝试的一种方法是:

Select Updated.value('/Fields/Field Name)[1]', 'nvarchar(max)') as NewUpdated from Audit. 

任何想法?

+0

如果你需要得到_each_场,你应该使用交叉与XML节点申请。如果你只需要第一个,你可以调整你当前的查询:'(Fields/Field/@ Name)[1]'。交叉应用可以这样工作:'SELECT NewUpdated = ABvalue('@ Name','nvarchar(max)')FROM Audit CROSS APPLY Audit.Updated.nodes('Fields/Field')AS A(B);' – ZLK

+0

我需要获得所有的字段。我正在尝试跨应用,但我得到一个错误:“Audit.updated.nodes'不是一个可识别的函数名称。我试着这样:select newupdated = ABvalue('@ name','nvarchar(max )'from Audit Cross Apply Audit.updated.nodes('Fields/Field')as A(B); – jackstraw22

+0

呃,你使用的是什么版本的SQL Server?在你粘贴的明显错字之外(没有闭括号'.value(...)'),没有理由我想不出为什么除非你使用SQL Server 2005,否则不行。 – ZLK

回答

1

你可以使用valuenodesstuff这样

DECLARE @Audit AS TABLE 
(
    Id int, 
    Updated xml 
) 

INSERT INTO @Audit 
(
    Id, 
    Updated 
) 
VALUES 
(1,N'<Fields><Field Name="DateFrom"/><Field Name = "Type 1"/><Field Name = "Type 2" /></Fields>'), 
(2,N'<Fields><Field Name = "DateFrom"/></Fields>'), 
(3, N'<Fields><Field Name="DateFrom"/><Field Name = "Note"/><Field Name = "Type 1"/></Fields>')  

    SELECT a.Id, ca.NewUpdated 
FROM @Audit a 
    CROSS APPLY 
    (
    SELECT STUFF(
        (SELECT ', ' + x.n.value('(./@Name)[1]', 'varchar(20)') 
        FROM a.Updated.nodes('/Fields/Field') x(n) 
        FOR XML PATH('') 
       ),1,2,'') AS NewUpdated 
    ) ca 

演示链接:http://rextester.com/NNF94534

+0

这看起来很有趣。如果字段名称的数量因记录而异,这是否会起作用?一些记录将具有“DateFrom”和“Type1”和“Notes”。其他人可能只有“DateFrom”等。它看起来好像你在对价值进行硬编码。值需要用该行的值动态填充。我还需要在一行中出现的所有值也显示在代码的一行中:如果那些是特定记录的字段,则DateFrom,Type1,Type2需要出现在一行上。 – jackstraw22

+0

我没有编码任何东西。如果你的'Field'元素具有'Name'属性,那么它将起作用。你能编辑你的问题,提供你的预期结果吗? – TriV

+0

我已经更新了更具体的问题。我只是在想,您手动将值输入到VALUES部分。问题中的XML是确切的。它使用 ... – jackstraw22

相关问题