如何将一列的结果放在字符串变量中?

时间:2017-03-06 09:30:15

标签: sql sql-server tsql string-aggregation

我尝试选择行数,然后将它们放入字符串变量,例如1,2,3,4,5,,但是会收到此错误:

  

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

我使用MSSQL SERVER

    DECLARE @CodeNameString VARCHAR(MAX)

SELECT @CodeNameString = STUFF(
           (
               SELECT dbo.CharterReference.TicketNo+','
               FROM   dbo.CharterReference

           ),
           1,
           1,
           ''
       )

SELECT @CodeNameString

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

如果您想要@CharterReference中的值,可以使用以下

Declare @CharterReference table (TicketNo int)
Insert Into @CharterReference values
(1),(2),(3),(4),(5),(6),(7),(8)

Declare @CodeNameString  varchar(Max) = '>>>'
Select @CodeNameString =replace(concat(@CodeNameString ,',',TicketNo),'>>>,','')
 From  @CharterReference
 Where TicketNo between 1 and 5
 Order By TicketNo

Select @CodeNameString

返回

1,2,3,4,5

或者您可以使用一点XML

Select @CodeNameString=Stuff((Select ',' +cast(TicketNo as varchar(25)) 
                               From  @CharterReference 
                               Where TicketNo between 1 and 5 
                               For XML Path ('') 
                              ),1,1,'') 

答案 1 :(得分:1)

错误消息正在抱怨,因为您返回了多行,并且不允许这样做。

重新排列到正常的选择语句,然后在之后删除最后一个逗号将解决此问题:

DECLARE @CodeNameString VARCHAR(MAX);
set @CodeNameString = '';

SELECT @CodeNameString = TicketNo + ','
FROM   dbo.CharterReference;

SELECT left(@CodeNameString, len(@CodeNameString)-1) as CodeNameString;

答案 2 :(得分:0)

基于SQL的解决方案要求您为此使用递归SQL。语法通常是特定于DBMS的,并且通过您在示例中使用的语法进行猜测,O相信您的引擎将此功能称为“递归CTE”。

另一种方法是将光标放在具有单独行的结果集上,并在客户端程序中构造字符串append。

另一种选择是使用系统的PL / SQL方言。然后,您可以编写一个SQL过程,在该过程中对结果集和字符串追加进行游标。您可以将此SQL过程作为可调用模块公开给客户端程序。