2

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

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

我使用 MSSQL 服务器

    DECLARE @CodeNameString VARCHAR(MAX)

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

           ),
           1,
           1,
           ''
       )

SELECT @CodeNameString

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

4

3 回答 3

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,'') 
于 2017-03-06T09:56:40.057 回答
1

错误消息正在抱怨,因为您返回了多行,而您这样做的方式是不允许的。

重新排列成一个正常的 select 语句,然后去掉最后一个逗号可以解决这个问题:

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

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

SELECT left(@CodeNameString, len(@CodeNameString)-1) as CodeNameString;
于 2017-03-06T09:59:35.870 回答
0

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

另一种方法是将光标悬停在具有单个行的结果集上,并在您的客户端程序中构造字符串追加。

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

于 2017-03-06T09:37:05.200 回答