返回使用FOR XML PATH('')的select语句的结果压缩到存储过程中的一行

时间:2015-06-11 15:16:09

标签: sql sql-server

我需要从我拥有的某些XML中提取多个值,并将其作为存储过程中的一个字符串返回。我创建了将所有行拉入一个的select语句。

这是我目前的代码。

CREATE FUNCTION openrpt.getSearchTermNames (@searchID NVARCHAR(MAX)) 
RETURNS VARCHAR(MAX) AS 
BEGIN 
  DECLARE @xmlData XML 
  DECLARE @Names XML 
  SET @xmlData = 
  ( 
         SELECT QueryXML 
         FROM   ConflictsSearchTerms 
         WHERE  ConflictsSearchTerms.[ID] = @searchID); 
  WITH xmlnamespaces ( default 'http://schemas.datacontract.org/2004/07/IntApp.Wilco.Model.Conflicts.Searches', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays' AS d2p1, 'http://www.w3.org/2001/XMLSchema-instance' AS i ) 
  RETURN 
  ( 
         SELECT '; ' + temp.value('.', 'NVARCHAR(MAX)') 
         FROM   @xmlData.nodes('/ConflictsSearchTermQuery/TermItems/d2p1:string') AS XMLDATA(temp)
         UNION 
         SELECT '; ' + temp.value('d2p1:Value[1]', 'NVARCHAR(MAX)')                                                 AS [Test]
         FROM   @xmlData.nodes('/ConflictsSearchTermQuery/CorporateTreeCompaniesById/d2p1:KeyValueOfstringstring') AS XMLDATA(temp) FOR XML PATH('') 
  )

select statemt将正确地返回由分号分隔的XML中这两个字段的项目列表,但我在返回时遇到语法错误。我也收到一个错误

The FOR XML clause is invalid in views, inline functions, derived tables, and subqueries when they contain a set operator. To work around, wrap the SELECT containing a set operator using derived table syntax and apply FOR XML on top of it.

1 个答案:

答案 0 :(得分:0)

试试这个:

CREATE FUNCTION openrpt.getSearchTermNames
    (
      @searchID NVARCHAR(MAX)
    )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 
        DECLARE @xmlData XML 
        DECLARE @Names XML 
        DECLARE @x XML


        SET @xmlData = ( SELECT QueryXML
                         FROM   ConflictsSearchTerms
                         WHERE  ConflictsSearchTerms.[ID] = @searchID
                       ); 

        WITH XMLNAMESPACES ( DEFAULT 'http://schemas.datacontract.org/2004/07/IntApp.Wilco.Model.Conflicts.Searches', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays' AS d2p1, 'http://www.w3.org/2001/XMLSchema-instance' AS i ) 
        SELECT @x =  
        ( SELECT * FROM (
             SELECT '; ' + temp.value('.', 'NVARCHAR(MAX)') AS [Test]
             FROM   @xmlData.nodes('/ConflictsSearchTermQuery/TermItems/d2p1:string') AS XMLDATA(temp)
             UNION 
             SELECT '; ' + temp.value('d2p1:Value[1]', 'NVARCHAR(MAX)')                                                 
             FROM   @xmlData.nodes('/ConflictsSearchTermQuery/CorporateTreeCompaniesById/d2p1:KeyValueOfstringstring') AS XMLDATA(temp))t 
             FOR XML PATH('') 
        )

        RETURN CAST(@x AS NVARCHAR(MAX))
    END