37

データベース全体を作成し、すべてのレコードを数十のテーブルに挿入するスクリプトがあります。処理中に問題が発生しない限り、うまく機能し、スクリプトが挿入中に失敗し、再びオフに設定できるようになる前に、テーブルが IDENTITY_INSERT ON のままになります。

これが発生すると、スクリプトを再度実行しようとすると、最初のテーブルの挿入に進むときに「IDENTITY_INSERT is already ON for table xx」というエラーが表示され、自動的に失敗します。

フェールセーフとして、セットアップ スクリプトで残りの処理を実行する前に、すべてのテーブルで IDENTITY_INSERT が OFF に設定されていることを確認したいと思います。

別の方法として、MS SQL 接続を閉じてから再度開くこともできます。これにより、接続セッションのすべての IDENTITY_INSERT 値がクリアされると理解しています。

これを行い、「既にオン」のエラーを防ぐ最善の方法は何ですか?

4

5 に答える 5

53

動的 SQL:

select 'set identity_insert ['+s.name+'].['+o.name+'] off'
from sys.objects o
inner join sys.schemas s on s.schema_id=o.schema_id
where o.[type]='U'
and exists(select 1 from sys.columns where object_id=o.object_id and is_identity=1)

次に、結果の SQL をコピーして別のクエリ ウィンドウに貼り付け、実行します。

于 2012-04-12T02:58:02.400 に答える
19
EXEC sp_MSforeachtable @command1="SET IDENTITY_INSERT ? OFF"
于 2012-04-12T02:55:31.173 に答える