web-dev-qa-db-ja.com

SQL Serverでテーブル変数が空かどうかを確認するにはどうすればよいですか?

これは、私のストアドプロシージャの1つのセクションです。

@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に複数のアイテムがあり、エラーが発生します:

サブクエリは複数の値を返しました。サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません。

理解できるので、次のように変更します。

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

完璧に動作します。私が持っているのはパフォーマンスの問題です。

テーブル変数が空かどうかを確認する簡単な方法があるかどうか疑問に思っています。

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

テーブル変数が空かどうかを確認するには、他の人がすでに述べたようにEXISTSを使用します。

しかし

空のセットと未知のセットが異なる場合(選択の余地はありません)、空のセットが本当に空であるか不明であるかを示す追加の変数を導入する必要があります。

declare @dataInTableIsUnknown BIT

...

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

テーブル変数はスカラー変数とは異なるため、@dataInTable IS NULLあなたが言ったように許可されていません。私は次のことを提案します:

EXISTS (SELECT 1 FROM @dataInTable)

あなたが実際にカウントを知りたいのであれば、以下もあなたの状況に意味があるかもしれません:

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

常にexistsがあります。

例えば:

select 'Yep'
where exists (select 1 from @dataInTable)
11
Factor Mystic