【问题标题】:Temporal Table result to variable doesn't work临时表结果到变量不起作用
【发布时间】:2023-03-18 17:17:01
【问题描述】:

我正在准备将临时表的结果设置为一个变量,这样做我做错了什么??

WITH Consolidado_B (CANTIDAD,CALIDAD) AS(
    select 
        SUM(cbs) [Cantidad],
        'BLANCOS' CALIDAD
    from CBases c
    inner join v_Bases v on v.CODIGO=c.basecodi
    where v.[NOMBRE COMPLETO] like '%blanco%' and
    c.colorcodi=@COLORCODI
    union
    select
        SUM(cbs),
        'ACCENT'
    from CBases c
    inner join v_Bases v on v.CODIGO=c.basecodi
    where v.[NOMBRE COMPLETO] like '%Acce%' 
    and c.colorcodi=@COLORCODI
)
SET @TOTALBASES=
(
SELECT sum(CANTIDAD) TOTAL 
FROM Consolidado_B
)

【问题讨论】:

  • “不起作用”是什么意思? (另外,你的标题不用SHOUT,我们可以读懂你的“内心声音”。)仅仅是因为你使用SET而不是SELECT吗?如果是这样,这只是一个印刷错误。
  • 对不起,它只是说靠近SET 的语法错误,所以我尝试而不是使用SET 尝试使用SELECT COLUMN INTO @VARIABLE FROM TABLE,但它无论如何都没有工作语法错误坚持
  • 但你仍然没有告诉我们那个错误是什么。 ://
  • 您当然想使用UNION ALL,即使您的 CTE 中生成的两个总和不太可能完全相同。但是我现在看到您在结果集中包含了一个文字,因此您勉强避免了这种逻辑错误 - 以更高的复杂性和更低的效率为代价。

标签: sql sql-server variables transactions temporal-tables


【解决方案1】:

使用可以只使用SELECT。但这会更简单:

select @TOTALBASES = SUM(cbs) 
from CBases c join
     v_Bases v
     on v.CODIGO=c.basecodi
where c.colorcodi = @COLORCODI or
      (v.[NOMBRE COMPLETO] like '%blanco%'  or v.[NOMBRE COMPLETO] like '%Acce%') ;

如果[NOMBRE COMPLETO] 可以同时匹配这两个条件,则这不是 100% 等价的——而且您实际上希望这些条件被计算两次。但是,它的效率要高得多。如果是这种情况,可以调整查询来处理这个问题 - 不会让您的查询变得复杂。

【讨论】:

    【解决方案2】:

    由于您没有提及,我猜错误消息是:子查询返回超过 1 个值。或未定义 Consolidado_B。

    CTE 需要与 select 语句在一起,而不是与 SET 语句分开。

    试试这个:

    WITH Consolidado_B (CANTIDAD,CALIDAD) AS(
        select 
            SUM(cbs) [Cantidad],
            'BLANCOS' CALIDAD
        from CBases c
        inner join v_Bases v on v.CODIGO=c.basecodi
        where v.[NOMBRE COMPLETO] like '%blanco%' and
        c.colorcodi=@COLORCODI
        union
        select
            SUM(cbs),
            'ACCENT'
        from CBases c
        inner join v_Bases v on v.CODIGO=c.basecodi
        where v.[NOMBRE COMPLETO] like '%Acce%' 
        and c.colorcodi=@COLORCODI
    )
    SELECT @TOTALBASES= sum(CANTIDAD) 
    FROM Consolidado_B
    

    【讨论】:

    • 哦,我现在明白了,@MLeblanc
    • 子查询不能返回多个值。使用SELECT SUM(Column) FROM Object; 这样的查询是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多