首页 > 解决方案 > 将子查询的结果连接成一个值

问题描述

我有一个存储过程,我正在构建一个报告,我遇到了一个希望得到解决的小问题。

存储过程只接受一个参数:

@nID varchar(max)=null

此参数可以是 NULL,有 1 个值 = '1' 或多个值 '1,3'

我有一个拆分函数,所以一个可能看起来像这样的参数:'1,3,5'会将它变成'1','3','5'。

这是我的选择语句(子查询)的一部分

Select Value1, 
(select tblIns.nDesc from tblIns where tblIns.nID in (SELECT items FROM 
dbo.SplitFunction(@nID, ',', 'nID'))) as 'Description'
From ....
Where ....

只要我在参数中只传递了 1 个值,查询就可以正常工作@nID,但是,当我传递多个值时,会出现以下错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

我的目标是,能够连接子查询结果,这样如果我传入超过 1 个值,则'Description'看起来像这样

 Text1, Text2, Text2

这样的事情可行吗?或者这会涉及更多的工作。

如果没有子查询,我可以将任意数量的值传递给 SP,它会产生正确的结果,我只需要获取参数的 TEXT 描述并将它们全部连接在一列中。

编辑说明:

tblIns

  nID       nDesc
  1         Text1
  2         Text2

假设我将值“1,2”作为参数传递到存储过程中,我希望得到的结果:

 Value1     Description
 Test       Text1, Text2

标签: sql-serverstored-proceduressubquery

解决方案


要将其放入变量中,这将在每个值和逗号分隔符周围放置单个引号:

DECLARE @OUTPUT as varchar(MAX)
Set @OUTPUT = ''

SELECT @OUTPUT = @OUTPUT + case when @OUTPUT = '' then '' else ', '  end + '''' + rtrim(TableValue) + ''''
    FROM dbo.Table

select @OUTPUT

-- 或者你可以像这样内联:

Select STUFF((
    SELECT ',' + TableValue    
    FROM dbo.TableLookup
    FOR XML PATH('')), 1, 1,'') 
FROM dbo.TableLookup

推荐阅读