15

これは、私のストアドプロシージャの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 ) )
)
4

3 に答える 3

34

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

EXISTS (SELECT 1 FROM @dataInTable)

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

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
IF @dataCount = 0 -- Empty
于 2012-01-05T18:26:49.767 に答える
11

常にありexistsます。

例えば:

select 'Yep'
where exists (select 1 from @dataInTable)
于 2012-01-05T18:28:10.210 に答える
7

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

しかし

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

declare @dataInTableIsUnknown BIT

...

AND (
    ( @dataInTableIsUnknown = 1 )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
于 2012-01-05T18:48:21.120 に答える