2012-04-27 4 views
0

가능합니까?선택에서 다른 삽입의 ID를 삽입 하시겠습니까?

첫째, 얼마나 많은 행 선택 (SELECT)

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

에서 다음 각 @@ IDENTITY를 얻기에 따라 INSERT를 실행합니다 : 여기

함께 실행 내가 찾고 뭔가있다 커서 나 동안 사용하지 않고

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

그렇지 않다면, 어떻게 가장 좋은 방법 : 행 삽입은 첫 번째 SELECT 문 같은 데이터를 포함한 새로운 삽입을 만들 것인가? 아래의 의견에 따라 OK

답변

3

적어도 두 가지 옵션이 있습니다. :

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

,이 시도 :

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

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

오류가 발생했습니다. 다시 업데이트해야하나요? –

+0

당신은 무엇을하려고합니까? 첫 번째 행에 xID = ID를 만들려고합니까? – therealmitchconnors

+0

첫 삽입의 @@ ID를 두 번째 삽입에 삽입하려고합니다 –

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

이러한 테이블 구조를 가정 :

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]

을 그런 것없는이 작업 (트랜잭션에서 가장)? :

-- 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
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이 필요하다고 생각하지 않습니다. 아래 내 솔루션을 참조하십시오 ... –

관련 문제