Sql server 在SQL Server的混合值表上查询XML中的值选择

Sql server 在SQL Server的混合值表上查询XML中的值选择,sql-server,xml,tsql,xquery,apply,Sql Server,Xml,Tsql,Xquery,Apply,我有一张桌子,上面有为慈善晚会买票的人,桌子上有注册活动的详细信息,XML将显示他们带来的客人,还有任何饮食要求的详细信息,以及偶尔可能残疾的人。本应将其推送到我们的CRM系统,但该系统目前不起作用 我试图从导入表中的某个列中提取一些XML值 我看到了很多查询普通XML块的示例,但当XML位于包含其他正常INT和VARCHAR值的表中时就没有了 我们正在使用SQL Server 2014。我花了好几个小时在谷歌上搜索,但对于将两者结合在一起的查询却一无所知。或者,即使我要将XML内容推送到一个临

我有一张桌子,上面有为慈善晚会买票的人,桌子上有注册活动的详细信息,XML将显示他们带来的客人,还有任何饮食要求的详细信息,以及偶尔可能残疾的人。本应将其推送到我们的CRM系统,但该系统目前不起作用

我试图从导入表中的某个列中提取一些XML值

我看到了很多查询普通XML块的示例,但当XML位于包含其他正常
INT
VARCHAR
值的表中时就没有了

我们正在使用SQL Server 2014。我花了好几个小时在谷歌上搜索,但对于将两者结合在一起的查询却一无所知。或者,即使我要将XML内容推送到一个临时表中,然后我可以使用它进行连接

Declare @xmlstring xml = '<field_import_admin_event_tickets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <und is_array="true">
    <item>
      <value>8463</value>
      <revision_id>4763</revision_id>
    </item>
  </und>
</field_import_admin_event_tickets>'

select 
    MainDataCenter.Col.value('(value)[1]', 'varchar(max)') as Name, 
    MainDataCenter.Col.value('(revision_id)[1]', 'varchar(max)') as Value
from 
    @xmlstring.nodes('/field_import_admin_event_tickets/und/item') as MainDataCenter(Col)
我可以粗略地从XML中获取值的唯一方法是将其强制转换为
VARCHAR
,并使用大量替换命令剥离XML标记,从而将其转换为值。每个XML块中可能有2到18个数值

这是我在StackOverflow上的第一篇文章,我已经花了好几天的时间在上面搜索,所以请对我温柔一点。谢谢

2019-07-10嘿,我没说清楚。 XML的每一列(少数为空)都包含2-34个独立的数字。我添加了一些粗略的数据操作,将其转换为VARCHAR并运行大量replace命令以更好地理解它。 然后我使用大量的子字符串将这一切推到一个新表中。这是粗糙但有效的,但假设每个值都有五位数长(到目前为止)。不过,我的老板不喜欢这个解决方案。
我只需要在每一行中提取每一组值,这样我就可以对它们进行连接或子查询,使用一行或一些可识别的内容。这些数字指的是参加慈善活动的客人,这些活动具有一些属性,如饮食要求或残疾

我不知道这是否是解决您的问题的最佳方法,但我希望我正确地回答了您的问题,您希望将针对独立XML的工作查询与表格查询相结合,其中XML是列的内容:

首先,我创建了一个有两行的模型

DECLARE @mockupTable TABLE(ID INT IDENTITY,SomeOtherValue VARCHAR(100),YourXml XML);
INSERT INTO @mockupTable(SomeOtherValue,YourXml) VALUES
('This is some value in row 1'
,'<field_import_admin_event_tickets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <und is_array="true">
    <item>
      <value>8463</value>
      <revision_id>4763</revision_id>
    </item>
  </und>
</field_import_admin_event_tickets>')

,('This is some value in row 2'
,'<field_import_admin_event_tickets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <und is_array="true">
    <item>
      <value>999</value>
      <revision_id>888</revision_id>
    </item>
  </und>
</field_import_admin_event_tickets>');
结果

ID  SomeOtherValue               Name   Value
1   This is some value in row 1  8463   4763
2   This is some value in row 2   999    888
简而言之:

APPLY
允许按行调用表值函数。在本例中,我们将列的内容(在您的示例中是XML)交给内置函数
.nodes()

JOIN
类似,我们得到了一个连接集,它将列(和行)添加到最终集。我们可以使用
.value()
方法从XML中检索实际值

如果这是最好的方法?我不知道


上面的示例只显示了一个
.nodes()
需要返回派生集中的几个
元素。只需一个
就可以直接使用
.value()
更轻松地完成此操作…

您好,Shnugo,我非常感谢您的帮助,但实际上我需要从XML列中提取值,以便在表的其余部分旁边查询它们。每一块XML将有2-18个值,一半来自“value”,一半来自“revision_id”@bcn_jonathan,请通过编辑选项重新输入您的问题,并尝试添加一个值。您可以将我的代码用于声明的测试表。添加一些减少但真实的样本数据和预期输出。很抱歉,你的评论没有告诉我你有什么问题。。。
SELECT t.ID
      ,t.SomeOtherValue
      ,MainDataCenter.Col.value('(value)[1]', 'varchar(max)') as Name 
      ,MainDataCenter.Col.value('(revision_id)[1]', 'varchar(max)') as Value
FROM @mockupTable t
CROSS APPLY t.YourXml.nodes('/field_import_admin_event_tickets/und/item') as MainDataCenter(Col);
ID  SomeOtherValue               Name   Value
1   This is some value in row 1  8463   4763
2   This is some value in row 2   999    888