여러 레코드를 삽입하고 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
'code' 카테고리의 다른 글
현재 COM 객체를 사용하는 올바른 방법은 무엇입니까? (0) | 2023.07.02 |
---|---|
둘 이상의 값을 반환하는 함수에서 할당하는 방법은 무엇입니까? (0) | 2023.07.02 |
v-for(vue.js)에서 데이터를 읽는 방법은 무엇입니까? (0) | 2023.07.02 |
MongoDB에서 열의 가장 높은 값 가져오기 (0) | 2023.07.02 |
openapi springboot generator jacksonno String-인수 생성자/공장 메서드에서 문자열 값을 역직렬화합니다. (0) | 2023.07.02 |