5

クラスを使用して、テーブルにSqlBulkCopy一度に 50k 行を挿入しています。このテーブルにトリガーをtbl_records 設定し、次のコードを使用しています。After Insert

SqlBulkCopy SqlBc1 = new SqlBulkCopy(strConnString, SqlBulkCopyOptions.FireTriggers);

// Set DataReader For SqlBulkCopy

sqlComm = new SqlCommand(strQuery, sqlTemCon);
sqlComm.CommandTimeout = 3600000;
sqlComm.CommandType = System.Data.CommandType.Text;
SqlDataReader dReader = sqlComm.ExecuteReader();       
SqlBc1.WriteToServer(dReader);

しかし、プログラムの実行後。First 挿入された 50k のうちの行のみのトリガーを起動します

すべての行で起動する必要があります。これどうやってするの??

4

4 に答える 4

9

トリガーが行ごとに起動することはありません。これらは、対応する DML ステートメントのすべての行に対して起動します。INSERTED多くの行を含むテーブルに対応できるように、トリガーを書き直してください。とにかく、これはベストプラクティスであり、必須のプラクティスです。

50k行から挿入された最初の行のみのトリガーを発射しています

おそらく、トリガーが仮想テーブルに複数の行を含むことができることを知らなかったために、状況を誤解しているに違いありません。

于 2013-09-25T11:01:38.847 に答える
4

デフォルトでは、SqlBulkCopy オブジェクトのバッチ サイズは行の完全なセットです。

MSDN は、BatchSize プロパティ値について次のように述べています。「ゼロ (デフォルト) は、各 WriteToServer 操作が単一のバッチであることを示します。

この場合、トリガーは 1 回起動しますが、挿入されたテーブルには、影響を受けるすべてのレコードのエントリが含まれます。

于 2013-09-25T11:04:08.710 に答える
0

私はこれを試してみましたが、うまくいきます。

お役に立てば幸いです..

CREATE TRIGGER Triggername ON TableName After INSERT AS SET NOCOUNT ON;

insert into TargetTable (Fields) SELECT (i.field1,i.field2,i.field3,....,i.fieldn) FROM inserted i GO

于 2016-02-23T12:38:48.480 に答える