从t-sql中的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>

XML 101-第1天

我在每一行中都有一列包含xml。每段xml都遵循相同的模板。我希望从一个节点中提取信息,无论其中有多少条目

例如:

<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