Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回select语句的结果,该语句使用FOR XML路径(';';)压缩到存储过程中的一行_Sql_Sql Server - Fatal编程技术网

Sql 返回select语句的结果,该语句使用FOR XML路径(';';)压缩到存储过程中的一行

Sql 返回select语句的结果,该语句使用FOR XML路径(';';)压缩到存储过程中的一行,sql,sql-server,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 = (

我需要从我拥有的一些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.
试试这个:

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  

您是否尝试使用
将Nvarchar(MAX)返回为
而不是Varchar?是的,我尝试在return处仍然得到语法错误。这允许我返回值,但它添加了我不想要的XML标记。它添加了一个名为Test的节点,将该值放入其中,而不仅仅返回值列表。我通过添加两个replace语句来消除标记,从而解决了这个问题。谢谢你的帮助