web-dev-qa-db-ja.com

複数の挿入ステートメントを使用する場合、SCOPE_IDENTITYを使用する方法はありますか?

CsvファイルからSQLServerデータベースに(Webアプリケーションを介して)多くのデータ行をインポートします。クライアント用に自動生成されたID値を戻す必要があります。

これをループで行うと、パフォーマンスが非常に悪くなります(ただし、SCOPE_IDENTITY()は問題なく使用できます)。

よりパフォーマンスの高いソリューションは、次のような方法です。

INSERT INTO [MyTable]
VALUES ('1'), ('2'), ('3')
SELECT SCOPE_IDENTITY()

最後に生成されたIDだけでなく、生成されたすべてのIDを取得する方法はありますか?

ご協力いただきありがとうございます!

よろしく、Thorsten

23
Thorsten Kraus

いいえ、SCOPE_IDENTITY()1つ、最新に挿入されたIDENTITY値のみを提供します。しかし、可能性はあります SQLServerのOUTPUT句を確認してください ..。

DECLARE @IdentityTable TABLE (SomeKeyValue INT, NewIdentity INT)

INSERT INTO [MyTable]
OUTPUT Inserted.Keyvalue, Inserted.ID INTO @IdentityTable(SomeKeyValue, NewIdentity)
VALUES ('1'), ('2'), ('3')

INSERTステートメントを実行すると、テーブル変数は「いくつかのキー値」(行を識別するため)と、挿入された各行に新しく挿入されたID値を保持します。今これで夢中になる! :-)

43
marc_s