Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在尝试从SQL Server获取XML字段_Sql_Sql Server_Xml - Fatal编程技术网

正在尝试从SQL Server获取XML字段

正在尝试从SQL Server获取XML字段,sql,sql-server,xml,Sql,Sql Server,Xml,我从一个表中获取数据,其中一列是XML格式的。该列称为Updated,该表称为Audit。字段如下所示: <Fields><Field Name="DateFrom"/><Field Name = "Type 1"/><Field Name = "Type 2/></Fields> <Fields><Field Name = "DateFrom"/></Fields> &l

我从一个表中获取数据,其中一列是XML格式的。该列称为Updated,该表称为Audit。字段如下所示:

    <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>
结尾类似于下面的内容,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.
有什么想法吗?

您可以使用值、节点和类似的东西

   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

演示链接:

如果需要获取每个字段,则应使用交叉应用程序和XML节点。如果您只需要第一个,您可以将当前查询调整为:Fields/Field/@Name[1]。交叉应用的工作方式如下:从审计交叉应用审计中选择NewUpdated=A.B.value'@Name',nvarcharmax';我需要得到所有的字段。我正在尝试交叉应用,但遇到一个错误:Audit.updated.nodes不是可识别的函数名。我正在尝试:从Audit交叉应用Audit.updated.nodes'Fields/Field'中选择newupdated=A.B.value'@name',nvarcharmax'作为AB;嗯,您使用的是什么版本的SQL Server?除了在.value…(值)上粘贴了明显的错误外,我想不出为什么除非您使用SQL Server 2005(比如说SQL Server 2005)。我使用的是SQL Server 2016。我的查询中确实有关闭的paren on值。我真的在用你的建议。a.B.value下有一条红线,消息为找不到列a或用户定义函数或聚合a.B.value,或者名称不明确。我尝试过这样做:选择t.c.value“Fields[1]”,“varchar100”mdata from Audit CROSS APPLY updated.nodes“/Field name”作为tc。这给了我一个“Field”附近的错误语法错误。如果我将“Field Name”替换为“Fields”,它将运行,但对所有行只返回NULL。这看起来很有趣。如果字段名的数量因记录而异,这是否可行?有些记录将有DateFrom、Type1和Notes。其他人可能只有DateFrom等。看起来您正在硬编码这些值。需要使用行的值动态填充值。我还需要显示在一行中的所有值也显示在代码中的一行中:DateFrom、Type1、Type2需要显示在一行中,如果这些是特定记录的字段。我没有编写任何代码。如果“Field”元素具有“Name”属性,那么它将工作。你能编辑你的问题,提供你期望的结果吗?我已经更新了问题,使之更具体。我只是想你手动将值输入到值部分。问题中的XML是精确的。它使用…您在选择内容之前错过了审核别名。只需更改为选择ca.newupdated FROM Audit a CROSS APPLY Select stuff Select'、'+x.n.value'/@Name[1]、'varchar50'FROM a.Updated.Nodes'/Fields/Field'xn for xml path''、1,2',就像newupdated caThis一样,但报告现在运行速度要慢得多。我这样假设是因为它必须提取所有xml代码。有没有办法加快速度?
   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