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なしで1行を返します(ここでの私の答えによると)

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 に答える