2009-09-03 2 views
1

내가 두 테이블내가 커서 않고 여러 삽입 할 수있는 방법

TBLA을 ( tableAID INT의 IDENTITY (1,1), foo는 VARCHAR (100))

tblB ( tableBID INTIDENTITY가 있다고 가정하자 (1,1), tableAID INT, bar varchar (100))

tblB.tableAID는 tblA에 대한 FK입니다.

시스템의 다른 테이블에서 가져온 일련의 레코드를이 테이블 쌍에 삽입하려고합니다. 나는 tblA에 삽입 할 수있는 ID가 tblB에 삽입되기 전에 무엇인지 알아야합니다.

행별로 처리하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

3

그리고 나중에, 당신은 두 번째 테이블에 새 키 값을 전달하기 위해 OUTPUT 절을 사용할 수 있습니다

INSERT INTO T ... 
OUTPUT PrimaryKeycol, otherValues INTO ChildTable; 

다른 possibilies이 존재 "구성 가능한 DML"및 MERGE 문과 함께 SQL Server 2008. 응답

추가는 언급합니다 :

create table T(i int identity(1,1), j int, k int default -1); 
go 

merge into T using (values (1), (2)) as U(j) 
on U.j = T.j 
when not matched then insert (j) values (j) 
output inserted.i, inserted.k; 
go 

drop table T; 
+0

이것은 내가 찾고있는 것에 가장 가깝습니다.유일한 단점은 OUTPUT 절이 대상 테이블에 지정된 열만 액세스 할 수 있다는 것입니다. 이는 닭고기 및 달걀 문제입니다. 대상 테이블에 삽입하는 고유 한 항목이 있으면 그냥 참여할 수 있습니다. 삽입 된 ID를 얻기 위해 목표 테이블. 그래도 뭔가 새로운 것을 가르쳐 줬기 때문에 대답을 수락합니다. – stannius

+2

팁 : INSERT 대신 MERGE를 사용하면 OUTPUT 절에 언급되지 않은 열을 포함 할 수 있습니다. 내 답변에 예제를 추가하겠습니다. –

0

임시 테이블을 사용할 수 있습니까?

DECLARE @t TABLE (foo, int, ba VARCHAR(50)) 
INSERT INTO @t (foo, bar) SELECT foo, bar FROM your_other_table 
ALTER TABLE @t ADD id_a INT IDENTITY(1, 1) 

당신은 어쩌면 당신은 테이블이 생산되는 동안 적절한 삽입을 수행하기위한 reseed 테이블에 원하는 것이이

을 할 SET IDENTITY_INSERT OFF를 사용해야합니다. 당신이 정말 요구하는 것은 서버에 여러 개의 라운드 트립을 방지하는 방법이라고 가정

DBCC CHECKIDENT 'tblA' RESEED, newValue 
+0

대상 테이블에 이미 데이터가 있으므로 거기에서 ID 값을 가져와야합니다. 또한 시스템이 실행되어 MAX (id) +1을 수행 할 수 없습니다. – stannius

+0

방금 ​​추가 정보를 입력했습니다 ... RESEED 물건을 설명하는 중 ... 아마도 유용 할 수 있습니다. –

0

는 다음 한 가지 방법은 모두 삽입을하는 저장된 프로 시저를 작성하는 것입니다, 이후

Set @Pk = Scope_Identity() 

를 사용 첫 번째 삽입은 해당 첫 번째 삽입에 대해 생성 된 Identity 값을 가져온 다음 두 번째 삽입에 해당 @Pk 값을 사용합니다. 여기

는 SQL Server 2005에서 간단한 예를

Create Procedure SaveEmployee 
@Name varChar(30), 
@DivId Int, 
@HomePhoneNumber VarChar(12), 
@FaxNumber VarChar(12) 
As 
Set NoCount On 
Declare @Pk Integer 


    Insert Employees(Name, Divisionid) 
    Values(@Name, @DivId) 
    Set @Pk = Scope_Identity() 
    -- ------------------------------------------------ 
    Insert PhoneNums(EmployeeId, PhoneType, PhoneNumber) 
    Values(@Pk, 'Home', @HomePhoneNumber) 
    -- ------------------------------------------------ 
    Insert PhoneNums(EmployeeId, PhoneType, PhoneNumber) 
    Values(@Pk, 'Fax', @FaxNumber) 

    Return 1 
+0

실제로 스크립트는 서버에서 실행 중입니다. 내가 피하려고하는 것은 커서입니다. – stannius

0

그것은 유용 지점을 지나서 아마, 그러나 이것은, 특히 외국 키로을 사용하여 대리 차 키를 이용하여 고유의 어려움을 지적 다른 테이블. 관계가 자연 키를 사용하여 정의 된 경우 처음부터 삽입 할 값을 알 수 있습니다.

+0

스키마를 정의하지 않았고 스키마를 제어 할 수있는 사용자가 대리 키 캠프에 있습니다. 어쨌든, 자연스러운 키가 해당 테이블에 적합한 지 확신하지 못합니다. 유일하게 잠재적 인 후보 사용자 ID + 제목이지만, 실제로 제목이 고유해야한다는 비즈니스 규칙은 없으며 아마도 비즈니스를 기반으로 데이터베이스를 제한합니다 규칙, 다른 방법은 아니지, 그렇지? – stannius

관련 문제