2013-03-13 97 views
2

我從檢索字段NTEXT XML格式的文本(下面一排的樣本格式):選擇多個節點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個節點)。如何將這些可變長度的多個節點值放入這些列中?

感謝所有幫助

回答

3

要獲得多個節點爲逗號分隔值可以使用for xml path('')招的變體。使用碎化的XML(TN)作爲子查詢中的源以獲取您感興趣的節點。xQuery ... substring(text()[1]) ...部分就是爲了刪除額外的逗號並從創建的XML中獲取逗號分隔值通過for xml

select 
    T.N.value('(CompanyName/text())[1]', 'varchar(250)') as CompanyName, 
    T.N.value('(WebsiteUrl/text())[1]', 'varchar(250)') as WebsiteUrl, 
    (
    select ', '+P.N.value('text()[1]', 'varchar(max)') 
    from T.N.nodes('PrimaryServices') as P(N) 
    for xml path(''), type 
).value('substring(text()[1], 2)', 'varchar(max)') as PrimaryServices, 
    (
    select ', '+S.N.value('text()[1]', 'varchar(max)') 
    from T.N.nodes('SecondaryServices') as S(N) 
    for xml path(''), type 
).value('substring(text()[1], 2)', 'varchar(max)') as SecondaryServices, 
    T.N.value('(Description/text())[1]', 'varchar(max)') as Description 
from @XML.nodes('/root/DocInfo') as T(N) 

如果您希望一列中的所有服務都可以在子查詢中的節點部分使用不同的xPath。

select 
    T.N.value('(CompanyName/text())[1]', 'varchar(250)') as CompanyName, 
    T.N.value('(WebsiteUrl/text())[1]', 'varchar(250)') as WebsiteUrl, 
    (
    select ', '+P.N.value('text()[1]', 'varchar(max)') 
    from T.N.nodes('PrimaryServices,SecondaryServices') as P(N) 
    for xml path(''), type 
).value('substring(text()[1], 2)', 'varchar(max)') as Services, 
    T.N.value('(Description/text())[1]', 'varchar(max)') as Description 
from @XML.nodes('/root/DocInfo') as T(N) 
+0

謝謝。這會得到xml和值。我如何獲得價值? T – 2013-03-13 19:15:29

+0

@ user971823你想要什麼值?在一列中,單獨的列,單獨的行或其他....或? – 2013-03-13 19:35:07

+0

單列逗號分隔將是理想的。 – 2013-03-13 20:02:46