T-SQL - присвоение параметров, поиск и сравнение данных в одной строке - возможно ли это? - PullRequest
1 голос
/ 18 января 2011

Я хочу сделать что-то подобное в 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, и с этим ничего не поделать Я в основном ищу ярлык, чтобы написать меньше кода:)

У кого-нибудь есть хорошие идеи?

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Макс. Агрегат вернет одну строку без GROUP BY (согласно моему ответу здесь)

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
1 голос
/ 18 января 2011

Предполагая, что вы не планируете использовать @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, который присваивает значение переменной, не должен сочетаться с извлечением данныхоперации.

...