質問: 私はこのシナリオを持っています、 COUNTRY、STATE、CITY、STREETの4つのテーブルがあります そして、私は今のところ、上記のような、おそらく2000行のレコードを持つ優れたファイルを持っています。 私はSqlBulkCopyを使用してデータを一時テーブルにインポートし、テーブルIMPORTの名前を付けました。 そして私は挿入されたレコードを取得し、国、州、市、ストリートを分割してそれぞれのテーブルに挿入するIMPORTテーブルに挿入するトリガを書きました。 このトリガーでは、COUNTRY名がすでに存在する場合はCOUNTRY_IDを返し、それ以外の場合は新しいCOUNTRY_IDを取得するなど、条件付きチェックを行う必要があります。 Excelファイルに行が1つしかない場合は、上記のように動作します。一度私はインポートのための元のExcelを置く私はそれがトリガーの次のステートメントは、 **"INSERTEDから国を選択"に**失敗**したと思っ**たsqlbulkcopy INSERTEDに複数のレコードを持っているため。 **テーブル構造** 国 * Country_ID * 国の名前 状態 * State_ID * Country_ID * State_Name シティ * City_ID * State_ID * Country_ID * 市の名前 通り * Street_ID * City_ID * State_ID * Country_ID * 道の名前 インポート * 国の名前 * State_Name * 市の名前 * 道の名前 だから私はINSERTEDのすべてのレコードをループするトリガのループ文を持つことができますか? またはこれを最善の方法で対処する方法は? **注:**彼らはすでにそれを使用しているので、私はそれらのテーブルの構造とその関係を制御できません。 前もって感謝します。
回答: あなたの最初の発行は、レコードセットを最初の選択肢としてループすることを決して考慮する必要がないということです。それはここにあるようにほとんど常に間違った選択です。あなたの次の問題は、トリガーが一度に1つずつではなく、あなたの説明からレコード全体を処理するということです。一度に1つのレコードを処理すると仮定して書いたと思います。セットベースのプロセスが必要です。 おそらく、カントリーテーブルにまだ入っていないすべての国を挿入するトリガーで、次のようなものが必要になると思われます(これは、country_Idが整数の列であることを前提としています)。 ``` Insert country (country_name) select country_name from inserted i where not exists (select * from country c where c.country_name = i.country_name) ``` トリガーの代わりにストアドプロシージャを使用して、ステージングテーブルから実際のテーブルに挿入することもできます。