4

次のスクリプトを想定します。

DECLARE @result TABLE(Id BIGINT);

DELETE FROM [Products].[Product]
OUTPUT DELETED.[Id] INTO @result
WHERE [Products].[Product].[Id] = 1589;

だから続けて私は試します:

1

SELECT CAST(ISNULL([Id], -1) AS BIGINT) AS N'RetValId' FROM @result;

null の場合[Id]は null (何もない) が返されましたが、これは -1 を返しました:

2

DECLARE @mi BIGINT;
SET @mi = (SELECT [Id] FROM @result)
SELECT CAST(ISNULL(@mi, -1) AS BIGINT) AS N'RetValId'

なんで?最初のスクリプトのどこに問題がありますか?

アップデート

削除されたIDがnullであるかどうかを確認する方法はありますか-1が返され、別の変数を宣言せずに返されたIDでない場合は?最も簡単な方法は何ですか?

4

3 に答える 3

6

ID 1589のエントリがない場合、DELETEDテーブルにはレコードがありません。レコードがある場合は、1589を返す必要があります。

したがって、このステートメントには入力行がないため、単純に何も返されないと思います。

SELECT CAST(ISNULL([Id], -1) AS BIGINT) AS N'RetValId' FROM @result;

(@resultから*を選択した場合、そこに行はありません)

選択後にNULL値を取得する変数に最初に設定したため、2番目のものは-1を返します。

DECLARE @mi BIGINT;
SET @mi = (SELECT [Id] FROM @result)

(この後に@miのみを選択した場合は、NULLにする必要があります)

それが説明だと思います

更新しました:

他の変数なしでそれを達成するために小さなトリックを試すことができますか?

SELECT CAST(ISNULL(MAX([ID]),-1) AS BIGINT) AS N'RetValId' FROM @result;

MAXのため、insieステートメントはNULLになるので、ここにトリックがあります。何かが削除された場合、IDはそこにあります。お役に立てば幸いです。

于 2012-08-27T05:25:58.783 に答える
1

で 1 行を返し-1、次にouter applyonを実行する派生テーブルを使用できます@result

select isnull(R.Id, T.Id) RetValId
from (values(-1)) as T(Id)
  outer apply @result as R
于 2012-08-27T05:48:40.007 に答える
0

null削除された行が@@rowcount変数ではない場合に戻る簡単な方法。前の操作によって影響を受けた行の数が含まれています。

DELETE FROM [Products].[Product]
WHERE [Products].[Product].[Id] = 1589;

IF @@ROWCOUNT = 0
    return null
return 1589
于 2012-08-27T05:46:13.237 に答える