Sql 将XML数据视为表
我在SQLServer2008R2中有一个带有XML列的表(Sql 将XML数据视为表,sql,sql-server,xml,sql-server-2008,Sql,Sql Server,Xml,Sql Server 2008,我在SQLServer2008R2中有一个带有XML列的表(DAT\u Detail)。在XML列中有一些测试的详细信息。。。(我无法将表更改为其他设计,它必须保持为XML)。 我的表有两列:DAT\u Detail\u ID(唯一标识符)和XMLDetaildata(XML) 这是添加我的测试数据的脚本: INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('629E4F85-098D-418B-BF2E-63648DCF
DAT\u Detail
)。在XML列中有一些测试的详细信息。。。(我无法将表更改为其他设计,它必须保持为XML)。
我的表有两列:DAT\u Detail\u ID
(唯一标识符)和XMLDetaildata
(XML)
这是添加我的测试数据的脚本:
INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('629E4F85-098D-418B-BF2E-63648DCF60ED', '<NewDataSet><DetailTest_A10><TestValue1>1321</TestValue1><TestValue2>142</TestValue2><TestValue3>153</TestValue3><TestValue4>1645</TestValue4><TestValue5>1123</TestValue5><TestValue6>114</TestValue6><TestValue7>1253</TestValue7></DetailTest_A10></NewDataSet>');
INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9', '<NewDataSet><DetailTest_A10><TestValue1>2321</TestValue1><TestValue2>242</TestValue2><TestValue3>253</TestValue3><TestValue4>2645</TestValue4><TestValue5>2123</TestValue5><TestValue6>214</TestValue6><TestValue7>2253</TestValue7></DetailTest_A10></NewDataSet>');
INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('E647B9FB-7B96-440A-ADCB-300F8DEA4BF1', '<NewDataSet><DetailTest_A10><TestValue1>3321</TestValue1><TestValue2>342</TestValue2><TestValue3>353</TestValue3><TestValue4>3645</TestValue4><TestValue5>3123</TestValue5><TestValue6>314</TestValue6><TestValue7>3253</TestValue7></DetailTest_A10></NewDataSet>');
INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('50041AE4-BE73-4281-A36E-7448F6F35E03', '<NewDataSet><DetailTest_A10><TestValue1>4321</TestValue1><TestValue2>442</TestValue2><TestValue3>453</TestValue3><TestValue4>4645</TestValue4><TestValue5>4123</TestValue5><TestValue6>414</TestValue6><TestValue7>4253</TestValue7></DetailTest_A10></NewDataSet>');
INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('87AE23BA-41DE-4C1E-BA4E-37E7C3419FE3', '<NewDataSet><DetailTest_A10><TestValue1>5321</TestValue1><TestValue2>542</TestValue2><TestValue3>553</TestValue3><TestValue4>5645</TestValue4><TestValue5>5123</TestValue5><TestValue6>514</TestValue6><TestValue7>5253</TestValue7></DetailTest_A10></NewDataSet>');
INSERT INTO DAT_Detail (DAT_Detail_ID, XMLDetaildata) VALUES ('9AAEA106-35C9-40B8-B0D5-7CA7F59E5D90', '<NewDataSet><DetailTest_A10><TestValue1>6321</TestValue1><TestValue2>642</TestValue2><TestValue3>653</TestValue3><TestValue4>6645</TestValue4><TestValue5>6123</TestValue5><TestValue6>614</TestValue6><TestValue7>6253</TestValue7></DetailTest_A10></NewDataSet>');
我得到的是一张桌子:
TestValue1 TestValue2 TestValue3 TestValue4 TestValue5 TestValue6 TestValue7
2321 242 253 2645 2123 214 2253
我试图将脚本更改为:
SELECT @XML = XMLDetaildata FROM DAT_Detail WHERE DAT_Detail_ID IN ( '9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9', '50041AE4-BE73-4281-A36E-7448F6F35E03')
要获得此信息:
TestValue1 TestValue2 TestValue3 TestValue4 TestValue5 TestValue6 TestValue7
2321 242 253 2645 2123 214 2253
4321 442 453 4645 4123 414 4253
但它失败了。。。有没有其他人能帮我找到正确的方向?您可以使用这种解决方案:
SELECT TestValue1,
TestValue2,
TestValue3,
TestValue4,
TestValue5,
TestValue6,
TestValue7
FROM (
SELECT dd.DAT_Detail_ID,
CAST(t.c.query('local-name(.)') as nvarchar(max)) as [Columns],
t.c.value('.','nvarchar(max)') as [Values]
FROM DAT_Detail dd
CROSS APPLY XMLDetaildata.nodes('/NewDataSet/DetailTest_A10/*') as t(c)
WHERE dd.DAT_Detail_ID IN (
'9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9',
'50041AE4-BE73-4281-A36E-7448F6F35E03')
) t
PIVOT (
MAX([Values]) FOR [Columns] IN (TestValue1,TestValue2,TestValue3,TestValue4,TestValue5,TestValue6,TestValue7)
) as pvt
输出:
TestValue1 TestValue2 TestValue3 TestValue4 TestValue5 TestValue6 TestValue7
4321 442 453 4645 4123 414 4253
2321 242 253 2645 2123 214 2253
或:
改用xml函数
SELECT n.x.value('TestValue1[1]', 'INT') as TestValue1, n.x.value('TestValue2[1]', 'INT') as TestValue2 --, ...
FROM DAT_Detail
CROSS APPLY XMLDetaildata.nodes('/NewDataSet/DetailTest_A10') n(x)
WHERE DAT_Detail_ID IN ('9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9', '50041AE4-BE73-4281-A36E-7448F6F35E03')
返回
您能描述失败的情况吗?一个变量
@XML
不能包含两个值。添加ORDER BY DAT\u Detail\u ID ASC/DESC
以确定您得到的是哪一个。@SeanLange I failed意味着我无法找到重写查询以获得所需结果的方法。。。但以下三个答案都很好,我不得不选择一个。:-)Thx,我接受了你的解决方案,因为它工作得很好,我可以将它应用到我的实际表中(上面的就是一个例子)。最好的部分是,我删除了where子句,而查询只获取了询问此特定测试的行。我有更多不同的测试,现在我为每个测试1特定的查询编写,查询只显示受影响的行。真不错!这个解决方案也对我有用。。。谢谢你的帮助。这个解决方案也对我有用。。。谢谢你的帮助。@Scherbe如果你的答案对你有帮助,正确的感谢方式是对答案投赞成票(或者如果答案对你来说是最好的,就接受答案)。在StackOverflow上阅读更多有关此礼节的信息。
SELECT t.c.value('(*)[1]','nvarchar(max)') as TestValue1,
t.c.value('(*)[2]','nvarchar(max)') as TestValue2,
t.c.value('(*)[3]','nvarchar(max)') as TestValue3,
t.c.value('(*)[4]','nvarchar(max)') as TestValue4,
t.c.value('(*)[5]','nvarchar(max)') as TestValue5,
t.c.value('(*)[6]','nvarchar(max)') as TestValue6,
t.c.value('(*)[7]','nvarchar(max)') as TestValue7
FROM DAT_Detail dd
CROSS APPLY XMLDetaildata.nodes('/NewDataSet/DetailTest_A10') as t(c)
WHERE dd.DAT_Detail_ID IN (
'9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9',
'50041AE4-BE73-4281-A36E-7448F6F35E03')
SELECT n.x.value('TestValue1[1]', 'INT') as TestValue1, n.x.value('TestValue2[1]', 'INT') as TestValue2 --, ...
FROM DAT_Detail
CROSS APPLY XMLDetaildata.nodes('/NewDataSet/DetailTest_A10') n(x)
WHERE DAT_Detail_ID IN ('9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9', '50041AE4-BE73-4281-A36E-7448F6F35E03')
Select B.*
From Dat_Detail A
Cross Apply (
Select TestValue1 = B.value('TestValue1[1]','int')
,TestValue2 = B.value('TestValue2[1]','int')
,TestValue3 = B.value('TestValue3[1]','int')
,TestValue4 = B.value('TestValue4[1]','int')
,TestValue5 = B.value('TestValue5[1]','int')
,TestValue6 = B.value('TestValue6[1]','int')
,TestValue7 = B.value('TestValue7[1]','int')
From XMLDetaildata.nodes('/NewDataSet') AS A(Grp)
Cross Apply A.Grp.nodes('DetailTest_A10') AS B(B)
) B
Where DAT_Detail_ID IN ( '9B30DDAF-0733-4D0D-BCBD-54DA3B56C8F9', '50041AE4-BE73-4281-A36E-7448F6F35E03')