それが 1 を返す理由は、正確に 1 つの値 (何らかの任意の値) を割り当てたためです。EXISTS
@Siveが示唆するように、とにかく手動カウントを行う代わりに使用する必要があります。その理由は、 EXISTS は COUNT よりもパフォーマンスが悪くないためです。説明しているユースケースでは、とにかく実際のカウントが何であるかは問題ではありません。カウントがゼロかゼロより大きいかを知りたい。
あなたが行った方法でその値を変数に割り当てる際の問題は、一致する行が複数ある場合にどうなるでしょうか? 試してみよう:
DECLARE @foo TABLE([var] INT, varname SYSNAME);
INSERT @foo VALUES (1,N'bob'),(2,N'bob');
DECLARE @var INT;
SET @var = (SELECT [var] FROM @foo WHERE varname = N'bob
結果:
メッセージ 512、レベル 16、状態 1、行 4
サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。
が一意の場合、次のvarname
ようにします。
SELECT @var = [var] FROM dbo.varDB WHERE varName = @varName;
IF @var IS NOT NULL
BEGIN
// carry out insert
END
ELSE
BEGIN
PRINT 'Already existed! ' + RTRIM(@var);
END
varname
が一意でない場合、単一の値で何をしようとしているのかわかりません。どっちが引いた?次のシナリオを想像してください。
DECLARE @foo TABLE([var] INT, varname SYSNAME);
INSERT @foo VALUES (3,N'bob'),(2,N'adam'),(1,N'bob');
DECLARE @var INT;
SELECT @var = [var] FROM @foo WHERE varname = N'bob';
PRINT @var;
@var
1または3になりますか?知るか?潜在的に多くの値の 1 つだけをキャプチャする場合、それがどれであるかが問題になるのはなぜですか? 他の行ではなく、その行で何かをするつもりですか?
さらに、このテーブルからデータを挿入することを意図している場合は、事前チェックや行数などを単純に破棄して、次のように言ってください。
INSERT dbo.SomeTable(column1 --,...other columns
SELECT var --,...other columns
FROM dbo.varDB
WHERE varName = @varName;
行が存在しない場合、挿入は行われません。