uniqueidentifiers を使い始めたところ、予期しない問題が発生しました。
まず第一に、通常は SCOPE_IDENTITY() を使用しますが、uniqueidentifier ではこれができなくなりましたが、概念上はデフォルト (newid() または newsequentialid()) の結果として自動生成された id 値が含まれます。 ) 制約。
INSERT ステートメントで OUTPUT 句を使用して、UUID をテーブル変数に出力することにしました。考えてみると、OUTPUT 句は SCOPE_IDENTITY を時代遅れにしています。これは、同じことやそれ以上のことを達成するためのより明確で強力な方法であるためです (たとえば、挿入されたすべての行に対して複数の自動生成された列に明確かつ直接アクセスできます)。
ただし、OUTPUT を使用すると、通常は挿入に続く @@rowcount のテストにどのように影響するのか疑問に思っています。@@rowcount は、メイン ステートメントに挿入された行数または出力句によってテーブル変数に挿入された行数を反映しますか?
違いはないと思うかもしれませんが (つまり、どちらの方法でもカウントは同じでなければなりません)、違いはあります。なぜなら、挿入ステートメントが失敗した場合でも、OUTPUT 句は値を返し、テーブルにデータを入力するとドキュメントに記載されているからです。 .
OUTPUT 句を持つ UPDATE、INSERT、または DELETE ステートメントは、ステートメントでエラーが発生してロールバックされた場合でも、クライアントに行を返します。ステートメントの実行時にエラーが発生した場合は、結果を使用しないでください。
特に@@rowcountは、OUTPUTを使用する場合にのみ最も外側のステートメントを常に反映することに言及していますが、これはネストされたクエリのコンテキストであると言及しています。私の場合の OUTPUT 句は最も外側のステートメントの一部であるため、insert ステートメントが失敗した場合に @@rowcount が出力テーブルに挿入された行数を報告するかどうかは不明です。
declare @new_uuid TABLE (ID uniqueidentifier);
insert into Users (ID, PersonID, Username, Password, Notes, Enabled)
output INSERTED.UUID into @new_uuid
values (@id, @personid, @username, @password, @notes, @enabled )
if (@@rowcount <> 1) goto fail; --does this reflect rows inserted into Users or @new_uuid? What if the insert fails, and rows are still output to @new_uuid?