質問

2つのテーブルがあり、最初のテーブルにはIDであるプライマリキーがあり、2番目のテーブルにはないプライマリキーがありますが、そのキーには最初のテーブルのプライマリキーに戻る外部キー制約があります。

一度に1つのレコードを挿入する場合、Scope_Identityを使用して、2番目のテーブルに挿入するテーブル1に挿入したpkの値を取得できます。

私の問題は、両方のテーブルに挿入したい選択からの多くのレコードがあることです。これらの挿入を行うセットベースの方法を考えることができませんでした。

現在の解決策は、カーソルを使用して、最初のテーブルに挿入し、scope_identityを使用してキーを取得し、2番目のテーブルに挿入して、繰り返します。

非カーソルソリューションがありませんか?

役に立ちましたか?

解決

はい、Books onlineでoutput句を検索します。

他のヒント

今週、この問題が発生しました。誰かが無意味な代理キーを持つテーブルを、自然にキーが使用されるスキーマに導入しました。間違いなくすぐにこれを修正します:)それまでは、 INSERT のデータテーブルを作成することでこれを回避しています:これは永続的または一時的なベーステーブルまたは派生テーブル(以下を参照してください)、それはいずれにせよセットベースのソリューションに対するあなたの欲求に合うはずです。このテーブルと、ナチュラルキーの IDENTITY 列を持つテーブルとの結合を使用して、自動生成された値を見つけます。以下に簡単な例を示します。

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top