여러 레코드를 삽입하고 ID 값을 얻는 방법은 무엇입니까?
다른 테이블 B의 테이블 A에 여러 레코드를 삽입하고 있습니다. 커서를 사용하지 않고 테이블 A 레코드의 ID 값을 가져오고 테이블 b 레코드를 업데이트하는 방법이 있습니까?
Create Table A
(id int identity,
Fname nvarchar(50),
Lname nvarchar(50))
Create Table B
(Fname nvarchar(50),
Lname nvarchar(50),
NewId int)
Insert into A(fname, lname)
SELECT fname, lname
FROM B
MS SQL Server 2005를 사용하고 있습니다.
MBelly는 돈에 맞습니다. 그러나 트리거는 필요하지 않은 경우에도 항상 테이블 B를 업데이트하려고 시도합니다 (테이블 C에서 삽입하고 있기 때문입니까?).
Darren도 여기서 정확합니다. 결과 집합으로 여러 ID를 다시 가져올 수는 없습니다. 옵션은 커서를 사용하고 삽입하는 각 행에 대한 ID를 가져 오거나 ID를 전후에 저장하는 Darren의 접근 방식을 사용하는 것입니다. 세 가지 이벤트 모두에 대해 테이블이 잠겨 있는지 확인하는 한 ID의 증분을 알고 있으면 작동합니다.
그것이 나이고 시간이 중요하지 않다면 커서를 가지고 갈 것입니다.
2005 년의 출력 절을 사용하십시오.
DECLARE @output TABLE (id int)
Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B
select * from @output
이제 테이블 변수에 삽입 한 모든 행의 ID 값이 있습니다.
질문을주의 깊게 읽으면 테이블 A의 새 ID 값을 기반으로 테이블 B를 업데이트하려고합니다.
삽입이 완료되면 업데이트를 실행하십시오.
UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
ON (B.FName = A.Fname AND B.LName = A.LName)
이는 FName / LName 조합을 사용하여 테이블 간의 레코드를 키 일치시키는 데 사용할 수 있다고 가정합니다. 그렇지 않은 경우 레코드가 올바르게 일치하는지 확인하기 위해 추가 필드를 추가해야 할 수 있습니다.
레코드를 일치시킬 수있는 대체 키가 없으면 테이블 B의 레코드를 서로 구별 할 수 없기 때문에 전혀 의미가 없습니다.
이 동작을 항상 원하면 테이블 B를 업데이트하는 AFTER INSERT 트리거를 TableA에 배치 할 수 있습니다.
행 번호를 결합하여 얻을 수 있습니다 . 이것은 ID이기 때문에 항목을 추가 할 때마다 증가하기 때문에 가능하며, 선택하는 순서대로됩니다.
내가 이해하는 한 당신이 가지고있는 문제는 ID 열이있는 테이블 A에 삽입하고 싶지 않은 테이블 B의 ID를 유지하려는 것입니다.
이렇게하려면 테이블 A에서 ID 삽입을 켜야합니다. 이렇게하면 삽입시 ID를 정의 할 수 있으며 충돌하지 않는 한 괜찮습니다. 그런 다음 다음을 수행 할 수 있습니다.
Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B
사용중인 DB가 확실하지 않지만 SQL Server의 경우 ID 삽입을 설정하는 명령은 다음과 같습니다.
set identity_insert A on
ID 대신 고유 식별자 유형을 사용하는 것이 좋습니다. 이 경우 삽입하기 전에 ID를 생성 할 수 있습니다.
update B set NewID = NEWID()
insert into A(fname,lname,id) select fname,lname,NewID from B
ReferenceURL : https://stackoverflow.com/questions/95988/how-to-insert-multiple-records-and-get-the-identity-value
'IT박스' 카테고리의 다른 글
window.performance.now () nodejs에서 동등합니까? (0) | 2021.01.10 |
---|---|
REST와 RPC 간의 웹 서비스 차이점 (0) | 2021.01.10 |
스크립트를 실행하여 ipython 시작 (0) | 2021.01.10 |
Python 3에서 sys.stdout 인코딩을 설정하는 방법은 무엇입니까? (0) | 2021.01.10 |
django.forms에 TextField가 없습니다. (0) | 2021.01.10 |