1

我想在 T-SQL 中做这样的事情,但它会返回一个错误:

DECLARE @Stock int

IF(SELECT @Stock = [Stock] FROM dbo.Products WHERE [ProductID] = 1) > 5
    PRINT 'Stock is good: Current stock is ' + @Stock
ELSE
    PRINT 'Order some more - we are below minimum stock'

返回的错误是:

消息 102,级别 15,状态 1,第 2 行:“=”附近的语法不正确。

我当然可以这样做:

DECLARE @Stock int

SELECT @Stock = [Stock] FROM dbo.Products WHERE [ProductID] = 1
IF(@Stock > 5)
    PRINT 'Stock is good: Current stock is ' + @Stock
ELSE
    PRINT 'Order some more - we are below minimum stock'

我不确定这是否只是 T-SQL 语言的工作方式,并且没有什么可做的。我基本上是在寻找写更少代码的捷径:)

有人有什么好主意吗?

4

2 回答 2

2

MAX 聚合将返回没有GROUP BY 的一行根据我的回答here)

SELECT
     CASE
         WHEN MAX(Z.Stock) > 5 THEN 'Stock is good: Current Stock' + CAST(MAX(Z.Stock) as varchar(10))
         ELSE 'Order some more - we are below minimum stock'
     END
FROM
    dbo.Products Z WHERE [ProductID] = 1

编辑:

无论如何,您永远不会从存储过程中打印..

--Do stuff

SELECT
     @Stock = MAX(Z.Stock),
     @UserMessage = 
         CASE
             WHEN MAX(Z.Stock) > 5
                 THEN 'Stock is good: Current Stock' + CAST(MAX(Z.Stock) as varchar(10))
             ELSE 'Order some more - we are below minimum stock'
         END
FROM
    dbo.Products Z WHERE [ProductID] = 1

--Do more stuff with @Stock
于 2011-01-18T06:00:46.133 回答
1

假设您不打算稍后在该过程中使用 @Stock,您可以执行以下操作:

Select Case
        When Z.Stock > 5 
            Then 'Stock is good: Current Stock' + Cast( Z.Stock as varchar(10))
        Else 'Order some more - we are below minimum stock'
        End
From (
    Select P.Stock
    From dbo.Products As P
    Where P.ProductId = 1
    Union All
    Select Value
    From ( Select 0 As Value ) As Z
    Where Not Exists    (
                        Select 1
                        From dbo.Products As P1
                        Where P1.ProductId = 1
                        )
    ) As Z

如果您想稍后在您的过程中重用@Stock,那么您必须执行多个语句。您不能将赋值与在 T-SQL 中的同一语句中返回数据的语句结合起来。只需尝试查看错误:

Declare @Foo int

Select @Foo = 42, object_id
From sys.objects

消息 141,级别 15,状态 1,第 3 行 将值分配给变量的 SELECT 语句不得与数据检索操作结合使用。

于 2011-01-18T04:31:03.667 回答