Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.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
Tsql 使用xpath从xml数据库列中选择多行(可能没有光标?)_Tsql_Xpath - Fatal编程技术网

Tsql 使用xpath从xml数据库列中选择多行(可能没有光标?)

Tsql 使用xpath从xml数据库列中选择多行(可能没有光标?),tsql,xpath,Tsql,Xpath,假设我有下表(其中历史是一个xml列): 我该怎么做 如果它只是一个独立的xml值,我可以这样做: DECLARE @xml2 XML = ' <History> <Node date="1-1-2011">World</Node> <Node date="1-2-2011">Foo</Node> <Node date="1-3-2011">Bar</Node> </History>'

假设我有下表(其中历史是一个xml列):

我该怎么做

如果它只是一个独立的xml值,我可以这样做:

DECLARE @xml2 XML = '
<History>
  <Node date="1-1-2011">World</Node>
  <Node date="1-2-2011">Foo</Node>
  <Node date="1-3-2011">Bar</Node>
</History>'

SELECT 
    x.value('(@date)[1]','date') AS [Date]
    ,x.value('.', 'nvarchar(50)') AS Value
FROM @xml2.nodes('/History/Node') temp(x) 
DECLARE@xml2 XML='1
世界
福
酒吧
'
挑选
x、 值(“(@date)[1]”,“date”)为[date]
,x.值(‘.’,‘nvarchar(50)’)作为值
从@xml2.nodes('/History/Node')temp(x)
但是,当XML数据是表列的一部分时,我不知道如何做。我可能会想出一种方法来强制使用
光标
,但我想知道是否有一种更优雅的声明式解决方案我不知道。

使用交叉应用

declare @T table (Id int, Value nvarchar(50), History xml)
insert into @T values (1, 'Hello','
<History>
  <Node date="1-1-2011">World</Node>
  <Node date="1-2-2011">Foo</Node>
  <Node date="1-3-2011">Bar</Node>
</History>')
insert into @T values (2, 'Baz','
<History>
  <Node date="1-1-2011">Buzz</Node>
  <Node date="1-2-2011">Fizz</Node>
  <Node date="1-3-2011">Beam</Node>
</History>')

select
    Id,
    h.n.value('.', 'varchar(10)') as Value,
    h.n.value('@date', 'varchar(10)') as Date
from @T
    cross apply history.nodes('History/Node') h(n)
declare@T表(Id int,值nvarchar(50),历史xml)
插入@T值(1,'Hello','
世界
福
酒吧
')
插入@T值(2,'Baz','
嗡嗡声
起泡
梁
')
选择
身份证件
h、 n.值(‘.’,‘varchar(10)’)作为值,
h、 n.值(“@date”,“varchar(10)”作为日期
来自@T
交叉应用历史。节点(“历史/节点”)h(n)

太棒了,谢谢!我想看看我是否能找到一个光标解决方案,但即使是在精选的前10名上也要花很长时间才能执行,这既优雅又快速。谢谢Mikael——我忘记了怎么做,通过谷歌来到这里的次数实在令人尴尬我觉得自己很棒,得+1分。
DECLARE @xml2 XML = '
<History>
  <Node date="1-1-2011">World</Node>
  <Node date="1-2-2011">Foo</Node>
  <Node date="1-3-2011">Bar</Node>
</History>'

SELECT 
    x.value('(@date)[1]','date') AS [Date]
    ,x.value('.', 'nvarchar(50)') AS Value
FROM @xml2.nodes('/History/Node') temp(x) 
declare @T table (Id int, Value nvarchar(50), History xml)
insert into @T values (1, 'Hello','
<History>
  <Node date="1-1-2011">World</Node>
  <Node date="1-2-2011">Foo</Node>
  <Node date="1-3-2011">Bar</Node>
</History>')
insert into @T values (2, 'Baz','
<History>
  <Node date="1-1-2011">Buzz</Node>
  <Node date="1-2-2011">Fizz</Node>
  <Node date="1-3-2011">Beam</Node>
</History>')

select
    Id,
    h.n.value('.', 'varchar(10)') as Value,
    h.n.value('@date', 'varchar(10)') as Date
from @T
    cross apply history.nodes('History/Node') h(n)