code

여러 레코드를 삽입하고 ID 값을 얻는 방법은 무엇입니까?

starcafe 2023. 7. 2. 20:52
반응형

여러 레코드를 삽입하고 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를 사용하고 있습니다.

2005년의 output 절을 사용합니다.

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의 레코드를 서로 구별할 수 없기 때문에 전혀 의미가 없습니다.

제가 이해하는 한, 당신이 가지고 있는 문제는 ID 열이 있는 표 A에 삽입하고 싶지 않은 표 B에서 ID를 보존하려는 것입니다.

그러기 위해서는 테이블 A의 ID 삽입 기능을 켜야 합니다.이렇게 하면 ID를 삽입할 때 정의할 수 있으며 충돌하지 않는 한 괜찮습니다.그러면 다음을 수행할 수 있습니다.

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B

사용 중인 DB가 확실하지 않지만 SQL 서버의 경우 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

항상 이 동작을 수행하려면 테이블 A에 테이블 B를 업데이트하는 AFTER 트리거를 설정할 수 있습니다.

번호에 가입하면 를 얻을 수 있습니다.이것은 ID이므로 항목을 추가하면 항목이 선택한 순서대로 증가하기 때문에 가능합니다.

-- first create a table for show how its works
CREATE TABLE [dbo].[myTable]
  (
     [id]   [INT] IDENTITY(1, 1) NOT NULL,
     [text] [VARCHAR](10) NULL
  )
ON [PRIMARY]

GO

-- var table for keep new inserted id
DECLARE @tblNewInserted TABLE
  (
     newids INT
  )

--use the output clause in insert statement
INSERT INTO [dbo].[myTable]
output      inserted.id
INTO @tblNewInserted
VALUES      ('aa'),('bb'),('cc')

SELECT *
FROM   @tblNewInserted 

Mbely는 돈에 딱 맞습니다. 하지만 트리거는 필요하지 않더라도 항상 테이블 B를 업데이트하려고 시도합니다(테이블 C에서도 삽입하기 때문에?).

대런도 여기서 옳습니다. 여러 개의 신원을 결과 집합으로 되돌릴 수 없습니다.커서를 사용하여 삽입한 각 행에 대한 ID를 가져오거나 전후에 ID를 저장하는 Darren의 방법을 사용할 수 있습니다.ID의 증분을 알고 있는 한 테이블이 세 가지 이벤트 모두에 대해 잠겨 있는지 확인하는 한 이 작업이 작동해야 합니다.

만약 저라면, 그리고 시간이 중요하지 않다면, 저는 커서를 가지고 갈 것입니다.

언급URL : https://stackoverflow.com/questions/95988/how-to-insert-multiple-records-and-get-the-identity-value

반응형