2012-04-27 37 views
0

這可能嗎?從Select中插入另一個插入的標識?

這裏是我要找的,執行起來:

首先,它會基於有多少行的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() 

如果沒有,什麼是最好的方式,而無需使用鼠標或在?

回答

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

完整性的最佳答案。 – 2012-04-27 23:42:53

0

OK,根據您在下面的意見,嘗試這個辦法:

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

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

err,我有點更新,我應該把它回來它是怎麼回事? – 2012-04-27 21:34:13

+0

你想要做什麼?你是否想在第一行中創建xID = ID? – therealmitchconnors 2012-04-27 21:35:31

+0

我試圖將第一個插入的@@標識插入第二個插入 – 2012-04-27 21:35:56

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。請參閱下面的解決方案 – 2012-04-27 22:18:13