我有一条xml消息,我需要使用存储过程从表中获取测试信息。
我一直在使用此查询:
select distinct
'N' as ORIGSTS,
doc1.Samples.value('(ID)[1]', 'nvarchar(20)') as 'SAMPLE_ID',
doc2.Tests.value('(Name)[1]', 'nvarchar(20)') as 'TEST_NAME'
from
@messageXml.nodes('/CDFAOrderMsg/Samples/Sample') as doc1(Samples),
@messageXml.nodes('/CDFAOrderMsg/Samples/Sample/Tests/Test') as doc2(Tests)
where doc1.Samples.value('(ID)[1]', 'nvarchar(20)') = 456
order by 2, 3
问题是它返回样本ID 456以及消息中列出的所有测试。我需要能够提取测试名称及其关联的样本ID以插入表中。目前,有两个样本和三个测试,当它应该只返回6时返回12行。
如何让它返回所有样本的列表及其各自的测试名称?
谢谢,
斯科特
<OrderMsg xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Samples>
<SourceType>Non-Animal</SourceType>
<Sample>
<ID>456</ID>
<Tests>
<Test>
<Name>SPC</Name>
</Test>
<Test>
<Name>COL</Name>
</Test>
<Test>
<Name>ANTI</Name>
</Test>
</Tests>
</Sample>
<Sample>
<ID>457</ID>
<Tests>
<Test>
<Name>HPC</Name>
</Test>
<Test>
<Name>DEL</Name>
</Test>
<Test>
<Name>NVT</Name>
</Test>
</Tests>
</Sample>
</Samples>
</OrderMsg>
答案 0 :(得分:0)
这是一个查询,它使用外部应用函数来获取预期结果,以获取子节点集合。
DECLARE @x xml
SET @x = '<OrderMsg xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Samples>
<SourceType>Non-Animal</SourceType>
<Sample>
<ID>456</ID>
<Tests>
<Test>
<Name>SPC</Name>
</Test>
<Test>
<Name>COL</Name>
</Test>
<Test>
<Name>ANTI</Name>
</Test>
</Tests>
</Sample>
<Sample>
<ID>457</ID>
<Tests>
<Test>
<Name>HPC</Name>
</Test>
<Test>
<Name>DEL</Name>
</Test>
<Test>
<Name>NVT</Name>
</Test>
</Tests>
</Sample>
</Samples>
</OrderMsg>'
SELECT DISTINCT
'N' AS ORIGSTS,
s.sampleNode.query('ID').value('.', 'nvarchar(20)') AS 'SAMPLE_ID',
t.testNode.query('Test/Name').value('.', 'nvarchar(20)') AS 'TEST_NAME'
FROM @x.nodes('//Samples/Sample') s (sampleNode)
OUTER APPLY (SELECT
x.testNode.query('.') testNode
FROM sampleNode.nodes('Tests/Test') x (testNode)) t
WHERE s.sampleNode.value('(ID)[1]', 'nvarchar(20)') = 456
ORDER BY 2, 3