INSERT 문의 OUTPUT 절을 사용하여 ID 값을 얻으려면 어떻게해야합니까?


240

다음과 같은 삽입 문장이있는 경우 :

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

OUTPUT 절을 사용하여 @var INT새 행의 ID 값 ( Id)을 어떻게 설정 합니까? 예를 들어 INSERTED.Name을 테이블 변수에 넣는 샘플을 보았지만 테이블이 아닌 변수로 가져올 수는 없습니다.

나는 시도했다 OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id그러나 어느 쪽도 아니는 일 없다.


3
@@ SCOPE_IDENTITY에 대해 이미 알고 있으며 OUPUT을 사용하여 수행하는 방법을 알고 싶습니다. 감사.
Yatrix 2016 년

6
테이블 변수에 삽입 한 다음 해당 변수를 선택해야합니다. OUTPUT절 에서 스칼라 변수에 직접 할당 할 구문이 없습니다 .
Martin Smith

3
OUTPUT 절 .. 테이블 또는 테이블 변수로 갖는 출력
mellamokb

5
OUTPUT절은 테이블에 씁니다. 테이블 변수, 임시 테이블, ... 일 수 있습니다.
HABO

2
내 질문은 특히 OUTPUT 절을 요구 합니다.
Yatrix

답변:


464

새로 삽입 된 ID를 SSMS 콘솔에 다음과 같이 출력 할 수 있습니다.

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

호출 응용 프로그램으로 ID를 다시 가져와야 할 때 C #에서도 사용할 수 있습니다- .ExecuteScalar()대신 SQL 쿼리를 실행 .ExecuteNonQuery()하여 결과를 ID다시 읽으십시오 .

또는 IDT-SQL에 새로 삽입 된 (예 : 추가 처리 를 위해) 캡처해야하는 경우 테이블 변수를 작성해야합니다.

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

이런 식으로 여러 값을 입력 @OutputTbl하고 그에 대한 추가 처리를 수행 할 수 있습니다 . 여기서 "일반"임시 테이블 ( #temp) 또는 "실제"영구 테이블을 "출력 대상"으로 사용할 수도 있습니다.


2
코드 뒤에 숨겨진 대답은 간결했습니다. ExecuteScalar () FTW
Joe Johnston

10
결과를에 삽입 real persistent table할 수 INSERT있습니다. 이는 TWO테이블에서 동시에 정보 를 얻을 수 있다는 것을 의미하기 때문에 매우 환상적 입니다.
gotqn

7
@@ IDENTITY를 사용하여 맨 위에서 빼지 마십시오. 트리거로 작업하기 어려운 방법을 골라서 하나의 테이블에 대한 변경 기록을 기록하고 새 테이블에 삽입하는 동시에 @@ IDENTITY가 기록 테이블에서 값을 반환하기 시작했습니다. 거기에서 큰 소리가납니다! marc_s '솔루션을 사용하십시오. 당분간 @OutputTbl 메소드를 사용했지만 다른 옵션에 흥미가 있습니다.
Eric Bishard

4
OUTPUT INTO는 "OUTPUT INTO 절의 대상 테이블이 (기본 키, 외래 키) 관계의 어느 쪽에도있을 수 없음"을 제외하고는 매우 환상적입니다. 잠재적 인 사용 사례의 약 99 %입니다. 나는 이것이 트랜잭션이 롤백 되어도 OUTPUT 절이 데이터를 반환 할 수 있기 때문에 가정하지만, 한 번에 관련 테이블 A 및 B에 데이터에 삽입하기가 너무 성가시다.
Robert Calhoun

3
@EricBishard SCOPE_IDENTITY()가 더 잘 작동합니다.
Derreck Dean
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.