0

これは可能ですか?

これが私が探しているもので、一緒に実行されます:

まず、SELECT の行数に基づいて INSERT を実行します。

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

次に、各 INSERTED ROW の @@IDENTITY を取得すると、最初の SELECT ステートメントと同じデータを含む新しい Insert が作成されます。

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

そうでない場合、カーソルまたは while を使用しない最善の方法は何ですか?

4

5 に答える 5

3

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

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

2)または、構成可能な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
于 2012-04-27T22:04:57.740 に答える
2
INSERT INTO TABLE2 (xID, NAME)
OUTPUT
INSERTED.xID, INSERTED.NAME, INSERTED.ID
INTO TABLE3 (xID, NAME, ID)
SELECT xID, NAME FROM [TABLE]
于 2012-04-27T21:49:14.747 に答える
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
于 2012-04-27T22:08:31.403 に答える
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
于 2012-04-27T22:01:15.013 に答える
0

OK、以下のコメントに基づいて、これを試してください:

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

  INSERT INTO TABLE3 (xID, NAME, ID)
  SELECT xID, NAME, @@identity
  FROM TABLE2;
于 2012-04-27T21:33:47.193 に答える