正确设置SQL本地变量

时间:2013-04-05 17:50:53

标签: sql sql-server local-variables

我想知道是否有办法让局部变量使用SELECT语句中的'FROM'语句,该语句未在变量的'SET'中声明。 我有以下示例:

DECLARE @IDNO int;
DECLARE @ORDERQUANTITY int;

SET @IDNO='1';  --TEST VALUE
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY), 0);

SELECT
Table1.IdNo AS 'ID No',
@ORDERQUANTITY AS 'Order Quantity'

FROM Table1

WHERE IdNo = @IDNO
GROUP BY IdNo, QUANTITY

我有很多列将列添加到一起,而那些添加在一起的列是从@ORDERQUANTITY变量中的语句派生的。

因此,我没有在SELECT语句中使用冗长的列定义,而是希望将事物放在变量中以使SELECT语句更简单(例如SELECT @ORDERQUANTITY - @ORDERSCANCELLED AS'Net Sold')

接受这个的最佳方式将不胜感激!

(使用SQL Server)

2 个答案:

答案 0 :(得分:0)

你的意思是:

SELECT @ORDERQUANTITY = COALESCE((SELECT SUM(QUANTITY) FROM dbo.Table1), 0);

如果您的目标是让后续查询更具可读性,我建议使用更短的变量名称而不使用@ALLCAPSFORVARIABLENAMESBECAUSETHEYARENOTVERYREADABLE

此外,我不知道你要对GROUP BY做什么,但它似乎根本没有必要(并且通过常量分组在任何情况下都不会做任何事情)。

现在,我不确定我是否完全遵循你想要做的事情。您是说您不想多次在SUM(QUANTITY)列表中重复SELECT,并且您希望用变量替换表达式而不是值* ?从您的代码中判断很难,但是这个SUM应该代表整个表,还是只代表给定的ID?一些想法:

  1. 如果您只为特定ID查找一行,则使用CTE /派生表,这样您就不必重复计算:

    ;WITH x AS 
    (
      SELECT oq = SUM(Quantity), oc = SUM(Cancelled)
      FROM dbo.Table1 WHERE IdNo = @IDNO
    )
    SELECT
      [Total Sold] = oq,
      [Cancelled] = oc, 
      [Net Sold] = oq - oc
    FROM x;
    
  2. 如果要在整个表中首先计算总和,请执行以下操作,这样您只需执行一次这些计算:

    SELECT
      @oq = SUM(Quantity),
      @oc = SUM(Cancelled)
    FROM dbo.Table1;
    
    ... and use those variables later ...
    
  3. 如果您尝试在一个变量中保存多个@IDNO值的值,则需要对此进行不同的思考。在处理多行集合时,不要再考虑变量作为持有坦克。告诉我们您实际想要实现的目标,而不是告诉我们您认为自己可以实现的目标。

  4. 最后,请停止使用AS 'single quotes'别名。如果您需要列别名的非法字符或保留字,请改为AS [square brackets]

答案 1 :(得分:0)

如果你问的是你能做到这一点:

DECLARE @ORDERQUANTITY int;
DECLARE @ORDERSCANCELLED int;
SET @ORDERQUANTITY=ISNULL(SUM(Table1.QUANTITY),0);
SET @ORDERSCANCELLED=ISNULL(SUM(Table1.CANCELLED),0);
SELECT @ORDERQUANTITY - @ORDERSCANCELLED

答案是肯定的