2016-01-12 21 views
0

XML 101 - 第1天从t-sql中的XML节点获取信息无论金额如何

我在每行都有一个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> 

我只希望返回L1CCTT,L2CCTT,L3CCTT。

然而,它的好处是,第二行的xml有多于或少于3个代码。

例子:

<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> 

我公司生产的东西,但我开始从代码列表节点接收外界的东西,有没有运气与制定where子句或特定节点码。

列:专案编号,数据

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 

道歉,如果这是一个简单的任务,但任何帮助,将不胜感激。

+0

这是为什么呢下来投票?无论如何,先生或女士Downvoter:你应该留下评论并解释你的理由。这是一个新用户。应该如何学会更好地做到这一点? +1从我身边... – Shnugo

回答

0

如果我理解正确,您需要第一个CodeList-Node的内容。

您与CROSS得到这个应用节点()上 - 功能与第一元件上的过滤器(只粘贴到一个空的查询窗口,执行):

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) 

结果(我改变了attribut “码号”在你的第二个例子“数”,认为这是一个错字......反正你说,那你只有感兴趣的节点的内容...):

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 
+0

@欢迎您来到SO,很高兴为您效劳!当你自己达到了15分,你可能会回来投票。快乐的编码! – Shnugo