【问题标题】:Unable to capture the output of the query in a variable无法在变量中捕获查询的输出
【发布时间】:2017-06-21 00:13:05
【问题描述】:

我基本上是在尝试将查询的输出存储在一个变量中,但收到错误消息

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

--DECLARE @companystring varchar(max)= '867343,867358,867443,867458,867543'

    DECLARE @companystring varchar(max)
    set @companystring = (SELECT DISTINCT Top 1000(mc.companyId) FROM ciqMarketCap mc 
    JOIN ciqCompany c   ON c.companyid = mc.companyid
    WHERE c.companyStatusTypeId NOT IN (5,6) AND  c.companyTypeId IN (1,4))


    select 
            ci.id
        into #companyId
        from dbo.splitstring(@companystring) ci

谁能告诉我是什么问题?

【问题讨论】:

  • 您的查询甚至没有假装尝试返回单行。我不知道你真正想做什么,但我想到了一个临时表。
  • 好吧,您的子查询返回 1000 行,并且您只能在子查询中返回 1(因此不允许在子查询中返回超过 1 个值的错误)。您实际上是在尝试将 1000 条记录填充到 1 个字符串中吗?
  • 基本上我想要做的是替代我更新帖子中评论的声明声明。我需要存储在该变量中的 1000 个公司 ID
  • 嗯,问题是您不能将多行结果集插入到标量变量中。 Table variables exist 支持将结果集保存到变量中,但是 a)它们与临时表几乎相同,并且 b)您立即将变量转储到临时表中。

标签: mysql sql sql-server


【解决方案1】:

如果我理解正确并且您需要将列数据转换为字符串,您可以使用下一个查询 -

DECLARE @companystring nvarchar(max)

SELECT TOP 1000 @companystring = coalesce(@companystring+';','') + CAST( mc.companyId AS nvarchar)
FROM ciqMarketCap mc 
JOIN ciqCompany c   ON c.companyid = mc.companyid
WHERE c.companyStatusTypeId NOT IN (5,6) AND  c.companyTypeId IN (1,4)

SELECT @companystring

【讨论】:

    【解决方案2】:

    首先,将大型数据集存储到 nvarchar/varchar 变量中并不理想。 适当的步骤是创建一个临时表变量。请参阅下面的编辑查询:

    DECLARE @companystring TABLE(companyId nvarchar(max));
    
    INSERT INTO @companystring(companyId)
    SELECT 
     DISTINCT Top 1000(mc.companyId) 
    FROM ciqMarketCap mc 
    JOIN ciqCompany c ON c.companyid = mc.companyid
    WHERE c.companyStatusTypeId NOT IN (5,6) 
    AND c.companyTypeId IN (1,4);
    
    select ci.companyId into #companyId from @companystring ci;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-10
      • 2021-09-03
      • 2019-04-01
      • 2020-01-16
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多