Sql server 选择多个xml节点

Sql server 选择多个xml节点,sql-server,xml,sql-server-2008,xquery-sql,Sql Server,Xml,Sql Server 2008,Xquery Sql,我正在从以下一行的ntext字段示例格式中检索xml格式的文本: <root> <DocInfo> <CompanyName>Some Company</CompanyName> <WebsiteUrl>http://www.someurl.com</WebsiteUrl> <PrimaryServices>Benefits Administration</PrimaryServ

我正在从以下一行的ntext字段示例格式中检索xml格式的文本:

<root>
  <DocInfo>
    <CompanyName>Some Company</CompanyName>
    <WebsiteUrl>http://www.someurl.com</WebsiteUrl>
    <PrimaryServices>Benefits Administration</PrimaryServices>
    <PrimaryServices>Payroll Processing</PrimaryServices>
    <SecondaryServices>Background Checking</SecondaryServices>
    <SecondaryServices>HR Outsourcing</SecondaryServices>
    <SecondaryServices>Comp & Benefits</SecondaryServices>
    <SecondaryServices>Administration</SecondaryServices>
  </DocInfo>
</root>
使用此sql检索单节点值:

select  @xmlString = COALESCE(@xmlString + '', '') + cast(content_html as nvarchar(max)) FROM  content where folder_id = 18
set @xmlString = replace(@xmlString,'<?xml version="1.0" encoding="UTF-16" standalone="yes"?>','')
set @XML = cast(@xmlString as xml)

Select
T.N.value('CompanyName[1]', 'varchar(250)') as CompanyName,
T.N.value('WebsiteUrl[1]', 'varchar(250)') as WebsiteUrl,
T.N.value('PrimaryServices[1]', 'varchar(250)') as PrimaryServices,
T.N.value('SecondaryServices[1]', 'varchar(250)') as SecondaryServices,
T.N.value('Description[1]', 'varchar(max)') as Description
from @XML.nodes('/root/DocInfo') as T(N)
这对于单节点值CompanyName、WebsiteUrl非常有效。然而,它并没有像PrimaryServices和SecondaryServices那样正确地插入具有多个值的节点——每个节点可能有0到16个节点。如何将这些可变长度的多节点值放入这些列中


感谢您的帮助

要将多个节点作为逗号分隔的值获取,您可以使用for xml路径技巧的变体。在子查询中使用分解的XML T.N作为源,以获取您感兴趣的节点。xQuery。。。子字符串文本[1]。。。第二部分就是删除多余的逗号,并从for XML创建的XML中获取逗号分隔的值

选择 T.N.value'CompanyName/text[1],'varchar250'作为CompanyName, T.N.value'WebsiteUrl/text[1],'varchar250'作为WebsiteUrl, 选择“,”+P.N.value“文本[1]”、“varcharmax” 来自T.N.节点的“主服务”作为PN 对于xml路径,键入 .value'substringtext[1],2','varcharmax'作为PrimaryServices, 选择“,”+S.N.value“文本[1]”、“varcharmax” 来自T.N.节点的“二次服务”作为序列号 对于xml路径,键入 .value'substringtext[1],2','varcharmax'作为辅助服务, T.N.值'Description/text[1]','varcharmax'作为说明 从@XML.nodes'/root/DocInfo'作为TN 如果希望所有服务都在一列中,可以在子查询的节点部分使用不同的xPath

选择 T.N.value'CompanyName/text[1],'varchar250'作为CompanyName, T.N.value'WebsiteUrl/text[1],'varchar250'作为WebsiteUrl, 选择“,”+P.N.value“文本[1]”、“varcharmax” 来自T.N.节点的“主要服务,次要服务”作为PN 对于xml路径,键入 .value'substringtext[1],2','varcharmax'作为服务, T.N.值'Description/text[1]','varcharmax'作为说明 从@XML.nodes'/root/DocInfo'作为TN
谢谢这将同时获取xml和值。我怎样才能得到价值呢?T@user971823你想要什么样的价值观?在一列中,分开的列,分开的行,或者其他什么?一列逗号分开会很理想。太好了。这正是我所需要的。谢谢