Как проверить, является ли переменная таблицы пустой в SQL Server? - PullRequest
11 голосов
/ 05 января 2012

Это раздел одной из моих хранимых процедур:

@dataInTable dbo.Table_Variable readonly,
....

AND (
    ( @dataInTable IS NULL )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)

@dataInTable IS NULL неверно в синтаксисе, ошибка

Должен объявлять скалярную переменную "@dataInTable"

Так что я изменил его на:

(SELECT T FROM @dataInTable) IS NULL

Это работает, но если @dataInTable имеет более 1 элемента, я получаю сообщение об ошибке:

Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется как выражение.

Понятно, поэтому я изменяю его на:

(SELECT TOP(1) T FROM @ProgramRatings) IS NULL

Работает отлично, меня беспокоит производительность.

Мне интересно, есть ли более простой способ проверить, является ли переменная таблицы пустой, например

AND (
    ( @dataInTable IS EMPTY )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)

Ответы [ 3 ]

26 голосов
/ 05 января 2012

Табличные переменные отличаются от скалярных переменных, поэтому @dataInTable IS NULL недопустимо, как вы упомянули. Я бы предложил следующее:

EXISTS (SELECT 1 FROM @dataInTable)

Следующее также может иметь смысл для вашей ситуации, если вы действительно хотите узнать количество:

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
IF @dataCount = 0 -- Empty
11 голосов
/ 05 января 2012

Всегда есть exists.

Например:

select 'Yep'
where exists (select 1 from @dataInTable)
6 голосов
/ 05 января 2012

Для проверки, является ли переменная таблицы пустой, просто используйте EXISTS, как уже упоминалось другими людьми,

но

если вы отличаете пустой набор от неизвестного набора - тогда у вас нет выбора - вы должны ввести дополнительную переменную, которая указывает, является ли пустой набор действительно пустым или неизвестным.

declare @dataInTableIsUnknown BIT

...

AND (
    ( @dataInTableIsUnknown = 1 )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
...