【问题标题】:How to put result of one column inside a string variable?如何将一列的结果放在字符串变量中?
【发布时间】:2017-03-06 09:30:15
【问题描述】:

我尝试选择行数,然后将它们放入字符串变量中,例如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

我该如何解决这个问题?

【问题讨论】:

标签: sql sql-server tsql string-aggregation


【解决方案1】:

如果你想要@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,'') 

【讨论】:

  • 你为什么使用第一个选项。不确定是否需要更换零件。它可以由@BeanFrog 共享完成。
  • @DK5 >>> 和 replace 用于标记第一个逗号可以使用的东西,如果你愿意的话。第一种技术比 XML Path 有更多的可能性,例如标记化字符串、动态映射等。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2022-07-25
      • 1970-01-01
      相关资源
      最近更新 更多