簡體   English   中英

如何在XQuery for SQL Server中聯接元素值?

[英]How to join element values in XQuery for SQL Server?

如果我有這個XML

<TradingInquirySearchResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SearchTerm>test</SearchTerm>
  <CompanyFound>true</CompanyFound>
  <CompanyInfoCollection>
    <CompanyInfo>
      <CompanyID>26</CompanyID>
      <CompanyName>test</CompanyName>
      <Status>Unrestricted</Status>
      <SearchTags>
        <Tag>test2</Tag>
        <Tag>test3</Tag>
        <Tag>test4</Tag>
      </SearchTags>
    </CompanyInfo>
  </CompanyInfoCollection>
</TradingInquirySearchResult>

我想獲取"test2;test3;test4" 如何為第一個<CompanyInfo>標簽加入<Tag>的值?

我嘗試了TransactionData.value('(/TradingInquirySearchResult/CompanyInfoCollection/CompanyInfo[1]/SearchTags/Tag)[1]', 'nvarchar(1000)')

但這沒用。

謝謝

在使用SQL Server 2012(而不是2017+)時,聚合字符串的常用方法是使用FOR XML PATHSTUFF ,並且可以使用nodes運算符獲取節點Tag的多個值。 這為您提供了以下內容:

DECLARE @XML xml = '
<TradingInquirySearchResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SearchTerm>test</SearchTerm>
  <CompanyFound>true</CompanyFound>
  <CompanyInfoCollection>
    <CompanyInfo>
      <CompanyID>26</CompanyID>
      <CompanyName>test</CompanyName>
      <Status>Unrestricted</Status>
      <SearchTags>
        <Tag>test2</Tag>
        <Tag>test3</Tag>
        <Tag>test4</Tag>
      </SearchTags>
    </CompanyInfo>
  </CompanyInfoCollection>
</TradingInquirySearchResult>';


SELECT STUFF((SELECT N';' +  ST.Tag.value('(./text())[1]','nvarchar(100)')
              FROM (VALUES(@XML))V(X)
              CROSS APPLY V.X.nodes('/TradingInquirySearchResult/CompanyInfoCollection/CompanyInfo/SearchTags/Tag') ST(Tag)
              FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,1,N'') AS Tags

編輯多個公司時進行猜測。

如果您只想要第一家公司,則可以,使用[1]將起作用:

DECLARE @XML xml = '
<TradingInquirySearchResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SearchTerm>test</SearchTerm>
  <CompanyFound>true</CompanyFound>
  <CompanyInfoCollection>
    <CompanyInfo>
      <CompanyID>26</CompanyID>
      <CompanyName>test</CompanyName>
      <Status>Unrestricted</Status>
      <SearchTags>
        <Tag>test2</Tag>
        <Tag>test3</Tag>
        <Tag>test4</Tag>
      </SearchTags>
    </CompanyInfo>
    <CompanyInfo>
      <CompanyID>27</CompanyID>
      <CompanyName>Sample</CompanyName>
      <Status>Restricted</Status>
      <SearchTags>
        <Tag>test6</Tag>
        <Tag>test7</Tag>
        <Tag>test8</Tag>
      </SearchTags>
    </CompanyInfo>
  </CompanyInfoCollection>
</TradingInquirySearchResult>';


SELECT STUFF((SELECT N';' +  ST.Tag.value('(./text())[1]','nvarchar(100)')
              FROM (VALUES(@XML))V(X)
              CROSS APPLY V.X.nodes('/TradingInquirySearchResult/CompanyInfoCollection/CompanyInfo[1]/SearchTags/Tag') ST(Tag)
              FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,1,N'') AS Tags;

但是,如果要每個公司排一行,則需要執行以下操作:

SELECT CIC.CI.value('(./CompanyID/text())[1]','nvarchar(50)') AS CompanyID,
       STUFF((SELECT N';' +  ST.Tag.value('(./text())[1]','nvarchar(100)')
              FROM CIC.CI.nodes('./SearchTags/Tag') ST(Tag)
              FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,1,N'') AS Tags
FROM (VALUES(@XML))V(X)
CROSS APPLY V.X.nodes('/TradingInquirySearchResult/CompanyInfoCollection/CompanyInfo') CIC(CI);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM