1

私は2つのテーブルを持っています.1つ目はIDである主キーを持ち、2つ目はそうでない主キーを持っていますが、そのキーには最初のテーブルの主キーへの外部キー制約があります。

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

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

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

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

4

2 に答える 2

2

はい、Books online で output 節を調べてください。

于 2009-06-18T13:00:26.570 に答える
0

ちょうど今週、この問題が発生しました。意味のない代理キーを持つテーブルが、自然にキーが使用されるスキーマに導入されました。間違いなくこれをすぐに修正します:)それまでは、データのテーブルを作成して回避しています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;
于 2009-06-19T07:49:16.643 に答える