从t-sql中的XML节点获取信息,无论数量如何
XML 101-第1天 我在每一行中都有一列包含xml。每段xml都遵循相同的模板。我希望从一个节点中提取信息,无论其中有多少条目 例如:从t-sql中的XML节点获取信息,无论数量如何,sql,sql-server,xml,tsql,Sql,Sql Server,Xml,Tsql,XML 101-第1天 我在每一行中都有一列包含xml。每段xml都遵循相同的模板。我希望从一个节点中提取信息,无论其中有多少条目 例如: <CodeLists> <CodeList CodeListID="FAC8BFB9-7C41-4647-A6DC-DF359379B8C3"> <Code Number="1">L1CCTT</Code> <Code Number="2">L2CCTT</Code>
<CodeLists>
<CodeList CodeListID="FAC8BFB9-7C41-4647-A6DC-DF359379B8C3">
<Code Number="1">L1CCTT</Code>
<Code Number="2">L2CCTT</Code>
<Code Number="3">L3CCTT</Code>
</CodeList>
<CodeList CodeListID="F0328C4F-916B-414D-AA81-D59244A4F0E1">
<Code Number="1">16 to 18</Code>
<Code Number="2">19 to 25</Code>
<Code Number="3">26 to 49</Code>
<Code Number="4">50 plus</Code>
</CodeList>
<CodeLists>
<CodeList CodeListID="DA730346-2425-439D-ABD0-7FFF1F16ED3E">
<Code CodeNumber="1">L1CCA</Code>
<Code CodeNumber="2">L2CCA</Code>
</CodeList>
<CodeList CodeListID="7B9731F5-C1B2-460D-B78F-F7C64A959022">
<Code CodeNumber="1">16 to 18</Code>
<Code CodeNumber="2">19 to 25</Code>
<Code CodeNumber="3">26 to 49</Code>
<Code CodeNumber="4">50 plus</Code>
</CodeList>
<CodeLists>
<CodeList CodeListID="74E6C8E2-BD88-4CB6-B578-DD25EC532CAA">
<Code Number="1">CIT33C</Code>
<Code Number="2">CIT32C</Code>
<Code Number="3">CIT31C</Code>
<Code Number="4">CIT30C</Code>
</CodeList>
<CodeList CodeListID="C6957FC8-F3B4-4DAE-A8D0-F79A253C5790">
<Code Number="1">16 to 18</Code>
<Code Number="2">19 to 25</Code>
<Code Number="3">26 to 49</Code>
<Code Number="4">50 plus</Code>
如果这是一项简单的任务,我深表歉意,但如果您能提供任何帮助,我将不胜感激。如果我理解正确,您需要第一个代码列表节点的内容 通过在nodes()函数上交叉应用,在第一个元素上使用一个过滤器(只需粘贴到一个空查询窗口并执行):
为什么会被否决?不管怎样,唐纳德先生或女士:你应该留下评论并解释你的理由。这是一个新用户。怎样才能学得更好呢+我这边…@威尔,欢迎加入,很高兴帮助你!当你自己达到15个代表点时(顺便说一句,我只是在你的另一个问题上推了你一点),你可能会回来投票支持这个问题。快乐编码!
SELECT [Data].value('(/CodeLists/CodeList/Code)[1]', 'varchar(4000)') [Code1]
,[Data].value('(/CodeLists/CodeList/Code)[2]', 'varchar(4000)') [Code2]
,[Data].value('(/CodeLists/CodeList/Code)[3]', 'varchar(4000)') [Code3]
,[Data].value('(/CodeLists/CodeList/Code )[4]', 'varchar(4000)') [Code4]
,[Data].value('(/CodeLists/CodeList/Code )[5]', 'varchar(4000)') [Code5]
FROM [dbo].Codes
WHERE ProjectID = 1
DECLARE @tbl TABLE(ID INT,Data XML);
INSERT INTO @tbl VALUES
(1,
'<CodeLists>
<CodeList CodeListID="FAC8BFB9-7C41-4647-A6DC-DF359379B8C3">
<Code Number="1">L1CCTT</Code>
<Code Number="2">L2CCTT</Code>
<Code Number="3">L3CCTT</Code>
</CodeList>
<CodeList CodeListID="F0328C4F-916B-414D-AA81-D59244A4F0E1">
<Code Number="1">16 to 18</Code>
<Code Number="2">19 to 25</Code>
<Code Number="3">26 to 49</Code>
<Code Number="4">50 plus</Code>
</CodeList>
</CodeLists>')
,(2,
'<CodeLists>
<CodeList CodeListID="DA730346-2425-439D-ABD0-7FFF1F16ED3E">
<Code Number="1">L1CCA</Code>
<Code Number="2">L2CCA</Code>
</CodeList>
<CodeList CodeListID="7B9731F5-C1B2-460D-B78F-F7C64A959022">
<Code CodeNumber="1">16 to 18</Code>
<Code CodeNumber="2">19 to 25</Code>
<Code CodeNumber="3">26 to 49</Code>
<Code CodeNumber="4">50 plus</Code>
</CodeList>
</CodeLists>')
,(3,
'<CodeLists>
<CodeList CodeListID="74E6C8E2-BD88-4CB6-B578-DD25EC532CAA">
<Code Number="1">CIT33C</Code>
<Code Number="2">CIT32C</Code>
<Code Number="3">CIT31C</Code>
<Code Number="4">CIT30C</Code>
</CodeList>
<CodeList CodeListID="C6957FC8-F3B4-4DAE-A8D0-F79A253C5790">
<Code Number="1">16 to 18</Code>
<Code Number="2">19 to 25</Code>
<Code Number="3">26 to 49</Code>
<Code Number="4">50 plus</Code>
</CodeList>
</CodeLists>');
SELECT tbl.ID,FirstCodeList.CodeNode.value('@Number','int') AS CodeNumber
,FirstCodeList.CodeNode.value('.','varchar(max)') AS Code
FROM @tbl AS tbl
CROSS APPLY tbl.Data.nodes('/CodeLists/CodeList[1]/Code') As FirstCodeList(CodeNode)
ID CodeNumber Code
1 1 L1CCTT
1 2 L2CCTT
1 3 L3CCTT
2 1 L1CCA
2 2 L2CCA
3 1 CIT33C
3 2 CIT32C
3 3 CIT31C
3 4 CIT30C