2012-04-27 11 views
0

これは可能ですか?ここで選択から別の挿入物のアイデンティティを挿入しますか?

は私が探している何か、一緒に実行されます。

まず、それがSELECT

INSERT INTO TABLE2 (xID, NAME) 
    SELECT xID, NAME FROM TABLE 

に続いて、各の@@ IDENTITYを取得行数に基づいてINSERTを実行します挿入された行は、それが最初のSELECT文の同じデータを含む新しい挿入を作成します。

INSERT INTO TABLE3 (xID, NAME, ID) 
    SELECT xID, NAME, ID as Scope_IdentitY() 

ない場合は、カーソルを使用しないか、しばらく何最善の方法は?この作品(取引で最高の)ではないだろうその後

TABLE_A 
----------- 
X_ID 
NAME 

TABLE_B 
---------------- 
TABLE_B_ID [PK] 
X_ID 
NAME 

TABLE_C 
---------------- 
TABLE_C_ID [PK] 
X_ID 
NAME 
TABLE_B_ID [FK]

INSERT INTO TABLE2 (xID, NAME) 
    SELECT xID, NAME FROM TABLE; 

    INSERT INTO TABLE3 (xID, NAME, ID) 
    SELECT xID, NAME, @@identity 
    FROM TABLE2; 

答えて

3

少なくとも2つのオプションがあります:

1)OUTPUT...INTO target_table句(SQL2005の+)

2)それとも、composable DML(SQL2008 +)を書くことができます。

例:

DECLARE @Table2 TABLE(
    ID INT IDENTITY PRIMARY KEY, --IDENTITY 
    xID INT NOT NULL, 
    NAME VARCHAR(25) NOT NULL 
); 

DECLARE @Table3 TABLE(
    ID INT PRIMARY KEY, --No IDENTITY 
    xID INT NOT NULL, 
    NAME VARCHAR(25) NOT NULL 
); 

--First solution: OUTPUT ... INTO 
INSERT INTO @Table2 (xID, NAME) 
OUTPUT inserted.xID, inserted.NAME, inserted.ID INTO @Table3(xID, NAME, ID) 
SELECT t.Col1, t.Col2 
FROM (SELECT 11,'A' UNION ALL SELECT 22,'B' UNION ALL SELECT 33,'C') AS t(Col1,Col2); 

--Second solution: composable DML 
INSERT INTO @Table3(xID, NAME, ID) 
SELECT src.xID, src.NAME, src.ID 
FROM 
(
     INSERT INTO @Table2 (xID, NAME) 
     OUTPUT inserted.xID, inserted.NAME, inserted.ID 
     SELECT t.Col1, t.Col2 
     FROM (VALUES(44,'D'),(55,'E'),(66,'F')) AS t(Col1,Col2) 
) src 

SELECT * FROM @Table2 
SELECT * FROM @Table3 
+0

完全性のための最善の答え。 –

0

OKは、これを試してください? :

-- Grab data from TABLE_A and INSERT INTO TABLE_B 
INSERT INTO TABLE_B (
    X_ID, 
    NAME 
) 
SELECT 
    X_ID, 
    NAME 
FROM 
    TABLE_A 

-- Grab data from TABLE_B that matches the data imported from TABLE_A 
-- and INSERT that data into TABLE_C (incl. the PK from TABLE_B) 

INSERT INTO TABLE_C (
    X_ID, 
    NAME, 
    TABLE_B_ID 
) 
SELECT 
    b.X_ID, 
    b.NAME, 
    b.TABLE_B_ID 
FROM 
    TABLE_B b 
INNER JOIN 
    TABLE_A a ON a.X_ID = b.X_ID
+0

エラーが発生しました。私はそれを元に戻す必要がありますか? –

+0

何をしようとしていますか?最初の行にxID = IDを作ろうとしていますか? – therealmitchconnors

+0

最初の挿入物の@@アイデンティティを2番目の挿入物に挿入しようとしています –

2
INSERT INTO TABLE2 (xID, NAME) 
OUTPUT 
INSERTED.xID, INSERTED.NAME, INSERTED.ID 
INTO TABLE3 (xID, NAME, ID) 
SELECT xID, NAME FROM [TABLE] 
0

は、これらのテーブル構造を仮定:下記のご意見をもとに

1

あなたは、テーブル変数を宣言し、この変数にdbo.Table2に挿入された行の出力を記憶し、テーブルdbo.Table3の入力としてテーブル変数を使用することができ

CREATE TABLE dbo.Table1 
(
     xid  int NOT NULL 
    , name varchar(30) NOT NULL 
); 

CREATE TABLE dbo.Table2 
(
     id  int NOT NULL IDENTITY 
    , xid  int NOT NULL 
    , name varchar(30) NOT NULL 
); 

CREATE TABLE dbo.Table3 
(
     id  int NOT NULL 
    , xid  int NOT NULL 
    , name varchar(30) NOT NULL 
); 

INSERT INTO dbo.Table1 (xid, name) VALUES 
    (195, 'abc'), 
    (242, 'def'), 
    (332, 'ghi'); 
GO 

DECLARE @tempTable table 
    (  id  int 
     , xid  int 
     , name varchar(30) 
    ); 

INSERT dbo.Table2 
    OUTPUT INSERTED.id, INSERTED.xid, INSERTED.name 
     INTO @tempTable 
     SELECT xid, name FROM dbo.Table1; 

INSERT dbo.Table3 (id, xid, name) 
    SELECT id, xid, name FROM @tempTable; 

SELECT id, xid, name FROM dbo.Table2; 
SELECT id, xid, name FROM dbo.Table3; 

GO 
+0

@tempTableが必要ないと思います。以下の私の解決策を見てください... –

関連する問題