Sql 返回select语句的结果,该语句使用FOR XML路径(';';)压缩到存储过程中的一行
我需要从我拥有的一些XML中提取几个值,并将其作为一个字符串从存储过程中返回。我已经创建了select语句,该语句将把所有行合并为一行 这是我目前拥有的代码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 = (
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语句来消除标记,从而解决了这个问题。谢谢你的帮助