2017-03-06 147 views
2

我尽量选择行数,然后把它们放到字符串变量如1,2,3,4,5,但得到这个错误:如何将一列的结果放入字符串变量中?

子查询返回多个值。当 子查询遵循=,!=,<,< =,>,> =或当子查询用作 表达式时,这是不允许的。

我使用MSSQL SERVER

DECLARE @CodeNameString VARCHAR(MAX) 

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

      ), 
      1, 
      1, 
      '' 
     ) 

SELECT @CodeNameString 

我怎样才能解决这个问题?

+1

您正在使用哪个数据库管理系统?该代码是特定于产品的。 – jarlh

+1

你可以参考这个:[SQL Server转换选择一列并将其转换为字符串](http://stackoverflow.com/questions/16193152/sql-server-convert-select-a-column-and-convert-它到字符串) –

+0

MSSQL服务器..... – programmer138200

回答

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,'') 
+0

为什么你有没有使用第一个选项。不确定它需要更换部件。它可以通过@BeanFrog共享完成。 – DK5

+1

@ DK5 >>>和替换是第一个逗号可以使用的东西,如果你宁愿。第一种技术比XML Path有更多的可能性,例如标记字符串,动态映射等。 –

+0

好吧,我现在明白了。感谢您解释:) – DK5

0

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

另一种方法是将游标放在结果集的各行上,并在客户端程序中构造字符串追加。

另一种选择是使用系统的PL/SQL方言。然后,您可以在结果集和字符串附加信息上编写SQL过程。您可以将此SQL过程作为可调用模块公开给客户端程序。

1

错误信息正在抱怨,因为你有多行返回,这是不允许的,你已经完成这个。

重新安排到正常看SELECT语句,然后砍掉最后一个逗号之后会解决此问题:

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

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

SELECT left(@CodeNameString, len(@CodeNameString)-1) as CodeNameString; 
相关问题