【问题标题】:Fetch queried xml nodes from a column in sql server 2005从 sql server 2005 中的列中获取查询的 xml 节点
【发布时间】:2014-07-04 02:15:09
【问题描述】:

我有一个有 2 列的表,第一个是带有主键的整数列,第二个是带有数据的 xml 列。

数据列包含xml如下

<Fields>
    <Field1>10</Field1>
    <Field2>11</Field2>
    <Field3>10</Field3>
    <Field4>11</Field4>
</Fields>

字段数不固定,每行可能有所不同。我想编写一个存储过程,它接受 2 个参数,逗号分隔的主键和逗号分隔的字符串。所以我的2个参数将是

32,54,63,653
Field1,Field2

sp 将返回一个数据表,内容如下

32 | <Fields><Field1>10</Field1><Field2>11</Field2></Fields>
54 | <Fields><Field1>50</Field1><Field2>62</Field2></Fields>
63 | <Fields><Field1>32</Field1><Field2>542</Field2></Fields>
653| <Fields><Field1>15</Field1><Field2>21</Field2></Fields>

我在从数据列的 xml 中仅选择所需节点时遇到问题。

编辑

我已经尝试了以下

select PricingXML.query('/Fields/Field1') from T_SMPricingData 

但是我想要上面的很多字段不仅仅是字段1

【问题讨论】:

  • 你能详细说明一下吗? “我在从数据列的 xml 中仅选择所需节点时遇到问题。”插入数据是一回事,提取数据是另一回事。您的数据库文件流是否启用?这是我从 mcsa 考试中记得的要求..
  • 数据库中的表在xml列中包含许多字段,但我只想选择参数2中提到的字段。所以我只需要提取那些数据并返回它。
  • 到目前为止你尝试过什么 SQL?
  • 我拆分参数但我不知道如何只提取我需要的节点

标签: sql sql-server xml sql-server-2005 stored-procedures


【解决方案1】:

试试这个:

select
  Roles
from
  MyTable
where
  Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'

您可能会发现更多示例代码herehere

另外,您可能对这个fiddle 感兴趣,它展示了如何查看 xml 列。

我习惯用以下方式查看 XML:

<School>
  <Class>Geography</Class>
  <Class>Mathematics</Class>
  <Class>Programming</Class>
  <teacher>Mrs Crabaple</Teacher>
</School>

field1, field2 毫无意义。赋予它们意义。

【讨论】:

  • 感谢您的指示,但我仍然卡住了。上面的查询将搜索 xml 标签内的值。我实际上想搜索 xml 标签而不是里面的值。
【解决方案2】:

使用您选择的拆分字符串函数,如下所示。

create function dbo.SplitString
(
  @List nvarchar(max),
  @Delimiter nvarchar(255)
)
returns table
with schemabinding
as
return 
(  
  select Item = T2.X.value('text()[1]', 'nvarchar(4000)')
  from (
       select convert(xml, N'<N>' + replace((select @List for xml path('')), @delimiter, N'</N><N>') + N'</N>').query('.')
       ) as T1(X)
    cross apply T1.X.nodes('N') as T2(X)
);

在这样的存储过程中使用它。

create procedure GetPricing
  @IDs nvarchar(max),
  @Nodes nvarchar(max)

as
select T.ID,
       (
       select F.X.query('.')
       from T.PricingXML.nodes('/Fields/*') as F(X)
         inner join dbo.SplitString(@Nodes, ',') as N
           on F.X.value('local-name(.)', 'nvarchar(100)') = N.Item
       for xml path(''), root('Fields'), type
       ) as PricingXML
from dbo.T_SMPricingData as T
  inner join dbo.SplitString(@IDs, ',') as N
    on T.ID = cast(N.Item as int)

SQL Fiddle

【讨论】:

  • 程序很棒。使用的许多关键字对我来说都是新的。谢谢
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多