2011-09-02 4 views
1

내가 table1에 여러 행을 삽입 함과 동시에 table1에서 pkID와 SP 매개 변수에서 제공되는 값이 함께 table2에 행을 삽입 할 필요가있다.는 SQL 서버에 두 개의 테이블에 행의 배치를 삽입 2008

table1에 삽입 할 행을 포함하는 테이블 값 매개 변수를 사용하여 배치 삽입을 수행하는 저장 프로 시저를 만들었습니다. 하지만 table2에 행을 삽입하는 데 문제가 있습니다. 해당 ID (신원)는 table1에서 전달 된 매개 변수 값과 함께합니다.

구현 한 사람이 있습니까? 아니면 이에 대한 좋은 해결책이 있습니까? - 출력을 사용하여 일시적 삽입 된 ID 값을 저장하고 다음 두 번째 INSERT 문을 생성 할 필요가 http://msdn.microsoft.com/en-us/library/ms177564.aspx

+0

코드를 게시 할 수 제대로 당신이 생각을 작동하지 않는? 삽입 된 레코드의 신원 값을 얻는데 문제가 있다면,'INSERT'는 그 값을 줄'OUTPUT' 절을 가지고 있습니다. – a1ex07

+1

내가 올바르게 당신을 이해하고 2008 년에 있다면 [merge..output을 사용하여 source.id와 target.id 사이의 매핑을 얻습니다.] (http://stackoverflow.com/questions/5365629/using-merge-output- 소스 ID와 타겟 ID 사이의 매핑을 얻으십시오. –

+0

예 Martin, 맞습니다. – user335160

답변

4

: 모든 삽입 된 ID 값을 필요로하기 때문에

CREATE PROCEDURE [dbo].[oSP_TV_Insert] 
    @uID int 
    ,@IsActive int 
    ,@Type int -- i need to insert this in table 2 
    ,@dTableGroup table1 READONLY -- this one is a table valued 
AS 

DECLARE @SQL varchar(2000) 
DECLARE @table1Id int 
BEGIN 

    INSERT INTO dbo.table1 
     (uID 
     ,Name 
     ,Contact 
     ,Address 
     ,City 
     ,State 
     ,Zip 
     ,Phone 
     ,Active) 
    SELECT 
     @uID 
     ,Name 
     ,Contact 
     ,Address 
     ,City 
     ,State 
     ,Zip 
     ,Phone 
     ,Active 
     ,@G_Active 
    FROM @dTableGroup 
--the above query will perform batch insert using the records from dTableGroup which is table valued 

SET @table1ID = SCOPE_IDENTITY() 

-- this below will perform inserting records to table2 with every Id inserted in table1. 

Insert into table2(@table1ID , @type) 
+0

marc_s- 정말 고마워요. 작동합니다! :) – user335160

0

, 삽입 문의 출력 절에 보면 절.

-- declare table variable to hold the ID's that are being inserted 
DECLARE @InsertedIDs TABLE (ID INT) 

-- insert values into table1 - output the inserted ID's into @InsertedIDs 
INSERT INTO dbo.table1(ID, Name, Contact, Address, City, State, Zip, Phone, Active) 
    OUTPUT INSERTED.ID INTO @InsertedIDs 
    SELECT 
     @ID, Name, Contact, Address, City, State, Zip, Phone, Active, @G_Active 
    FROM @dTableGroup 

다음은 두 번째 INSERT 문을 가질 수 있습니다 :

뭔가 같은

INSERT INTO dbo.table2(Table1ID, Type) 
    SELECT ID, @type FROM @InsertedIDs 

당신이 OUTPUT 절을 수행 할 수있는 작업에 대한 자세한 내용은 MSDN docs on the OUTPUT clause를 참조 - 중 하나를 요즘 가장 많이 사용되지 않는 SQL Server의 "알 수없는"기능입니다.

+0

scope_identity가 여기에있는 것이 마지막 것입니다. 첫 번째 것은 어떨까요? – user335160

+0

ID 열의 이름은 무엇입니까? 저장 프로 시저 삽입 문에 값을 제공하고 있기 때문에 ID 인 것처럼 보이지 않습니다. – Bryan

1

의 데이터를 모두 대상 테이블 삽입 OUTPUT 절에만 하나의 문장를 사용하는 또 다른 방법 :

--Parameters 
DECLARE @TableGroup TABLE 
(
    Name NVARCHAR(100) NOT NULL 
    ,Phone VARCHAR(10) NOT NULL 
); 
DECLARE @Type INT; 
--End Of parameters 

--Destination tables 
DECLARE @FirstDestinationTable TABLE 
(
    FirstDestinationTableID INT IDENTITY(1,1) PRIMARY KEY 
    ,Name NVARCHAR(100) NOT NULL 
    ,Phone VARCHAR(10) NOT NULL 
); 
DECLARE @SecondDestinationTable TABLE 
(
    SecondDestinationTable INT IDENTITY(2,2) PRIMARY KEY 
    ,FirstDestinationTableID INT NOT NULL 
    ,[Type] INT NOT NULL 
    ,CHECK([Type] > 0) 
); 
--End of destination tables 

--Test1 
--initialization 
INSERT @TableGroup 
VALUES ('Bogdan SAHLEAN', '0721200300') 
     ,('Ion Ionescu', '0211002003') 
     ,('Vasile Vasilescu', '0745600800'); 
SET  @Type = 9; 

--execution 
INSERT @SecondDestinationTable (FirstDestinationTableID, [Type]) 
SELECT FirstINS.FirstDestinationTableID, @Type 
FROM 
(
INSERT @FirstDestinationTable (Name, Phone) 
OUTPUT inserted.FirstDestinationTableID 
SELECT tg.Name, tg.Phone 
FROM @TableGroup tg 
) FirstINS 

--check records 
SELECT * 
FROM @FirstDestinationTable; 
SELECT * 
FROM @SecondDestinationTable; 
--End of test1 

--Test2 
--initialization 
DELETE @TableGroup; 
DELETE @FirstDestinationTable; 
DELETE @SecondDestinationTable; 

INSERT @TableGroup 
VALUES ('Ion Ionescu', '0210000000') 
     ,('Vasile Vasilescu', '0745000000'); 
SET  @Type = 0; --Wrong value 

--execution 
INSERT @SecondDestinationTable (FirstDestinationTableID, [Type]) 
SELECT FirstINS.FirstDestinationTableID, @Type 
FROM 
(
INSERT @FirstDestinationTable (Name, Phone) 
OUTPUT inserted.FirstDestinationTableID 
SELECT tg.Name, tg.Phone 
FROM @TableGroup tg 
) FirstINS 

--check records 
DECLARE @rc1 INT, @rc2 INT; 
SELECT * 
FROM @FirstDestinationTable; 
SET  @rc1 = @@ROWCOUNT; 
SELECT * 
FROM @SecondDestinationTable; 
SET  @rc2 = @@ROWCOUNT; 
RAISERROR('[Test2 results] @FirstDestinationTable: %d rows; @@SecondDestinationTable: %d rows;',1,1,@rc1,@rc2); 
--End of test1 
+0

+1 Composable DML은 SQL Server 2008에서만 사용할 수 있으며 몇 가지 제한 사항이 있습니다. –

관련 문제