2011-04-14 5 views
1

SCOPE_IDENTITY()은 단일 삽입에 의해 생성 된 ID를 검색하는 것으로 알고 있습니다. 이 단일 삽입을 수행하므로 삽입 트리거가있는 옵션이 없습니다삽입 된 행을 검색하는 방법이 있습니까

INSERT INTO [dbo].[myMagicTable] 
(
    [name] 
) 
SELECT [name] 
FROM  [dbo].[myMagicSource] 
WHERE  /* some weird where-clauses with several subselects ... */; 

INSERT INTO [dbo].[myMagicBackupTable] 
(
    [id], 
    [name] 
) 
SELECT 
    [id], 
    [name] 
FROM ??? 

: 현재 나는 문, 예를 들어 의해 생성 된 모든 행을 검색하는 마법 변수 또는 함수의 어떤 종류의 필요에있어 10.000 행의 배치에 대한 문제 ... 그래서, 이것을 달성 할 방법이 있습니까? 우리는 mssql2005를 사용하고 있습니다. <

답변

4

OUTPUT 절을 사용할 수 있습니다.

DECLARE @InsertedIDs table(ID int); 

INSERT INTO [dbo].[myMagicTable] 
    OUTPUT INSERTED.ID 
     INTO @InsertedIDs 
    SELECT ... 
+0

+1 놈 - 60 초 만에 나를 때리십시오 :-) –

1

당신은 (당신이 트리거처럼 Inserted 의사 테이블을 사용할 수있다) 임시 테이블 (아마도 테이블 변수)를 정의하고 INSERT에 OUTPUT 조항의 사용을 만들 수 :

DECLARE @NewIDs TABLE (MagicID INT, Name VARCHAR(50)) 

INSERT INTO [dbo].[myMagicTable]([name]) 
OUTPUT Inserted.MagicID, Inserted.Name INTO @NewIDs(MagicID, Name) 
    SELECT [name] 
    FROM  [dbo].[myMagicSource] 
    WHERE /

다음은 삽입 한 후 해당 테이블 변수를 사용

INSERT INTO 
    [dbo].[myMagicBackupTable]([id], [name]) 
    SELECT MagicID, [name] 
    FROM @NewIDs 

을하고 거기에서 이동합니다.

관련 문제