Как проверить, пуста ли переменная таблицы в SQL Server?

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

@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 ответов


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

но

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

declare @dataInTableIsUnknown BIT

...

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

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

EXISTS (SELECT 1 FROM @dataInTable)

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

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
IF @dataCount = 0 -- Empty

всегда exists.

например:

select 'Yep'
where exists (select 1 from @dataInTable)