스칼라 변수에 대한 SQL Server 출력 절


134

이를 수행하는 "간단한"방법이 있습니까, 아니면 "OUTPUT ... INTO"구문을 사용하여 테이블 변수를 전달해야합니까?

DECLARE @someInt int

INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)

답변:


161

테이블 변수가 필요하며 이것이 간단 할 수 있습니다.

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)

45
그러나 "SELECT @someInt = ID FROM @ID"를 선택해야합니다. 필요한 모든 결과가 int이면 추가 단계 (및 중간 테이블 변수)를 건너 뛸 수 있는지 알고 싶었습니다.
Benoittr

@Benoittr-값을 사용하는 방법에 따라 다르며 필요하지 않을 수도 있습니다. select 문의 from 절에서 테이블을 사용할 수 있습니다. 변수를 지정할 때 삽입이 하나의 행만 삽입했는지 확인해야합니다. 그리고 삽입이 하나의 행만 삽입하면 output? 절을 사용하는 대신 values ​​절에서 사용되는 것을 쉽게 잡을 수 있습니다 .
Mikael Eriksson

4
자동 생성 된 값의 경우 항상 값을 미리 알 수있는 것은 아닙니다 (ID, 계산 열). 해결 방법이 많이 있음을 이해합니다. 아직도, 당신은 나에게 내가 찾고있는 대답을 주었다. 감사합니다
Benoittr

정규 변수에 필요하십니까? DECLARE @InsertedIDResults TABLE (ID int); INSERT INTO MyTable (Name, Age) OUTPUT INSERTED.ID INTO @InsertedIDResults VALUES('My Name', 30); DECLARE @InsertedID int = (SELECT TOP 1 ID FROM @InsertedIDResults);
Arvo Bowen

30

1 년이 지난 후 ... 자동으로 생성 된 테이블의 ID를 얻는 것이 필요한 경우

SELECT @ReportOptionId = SCOPE_IDENTITY()

그렇지 않으면 테이블 사용에 갇힌 것처럼 보입니다.


6
내가 찾던 변수는 실제로 정체성 열과 다른 것이 었습니다. 그래도 대답 주셔서 감사합니다.
Benoittr

26
분명히 이것은 다중 프로세서 병렬 계획에 문제가 있으며 OUTPUT은 항상 신뢰할 수있는 유일한 방법입니다.
andrewb

6
마지막 INSERT가 아무 것도 삽입하지 않아도 SCOPE_IDENTITY ()는 무언가를 반환 할 수 있습니다 . 어떤 경우에는 사용할 수 없게됩니다.
Patrick Honorez

2
출력 절을 사용하는 것이 좋습니다
Clay Smith

1
@andrewb 버그는 2008 R2 SP1 에서 수정되었습니다 .
adam0101

6

나중에도 언급 할 가치가있는 것은 변수를 사용하여 UPDATE의 SET 절 또는 SELECT 필드에서 값을 출력 할 수도 있다는 것입니다.

DECLARE @val1 int;
DECLARE @val2 int;
UPDATE [dbo].[PortalCounters_TEST]
SET @val1 = NextNum, @val2 = NextNum = NextNum + 1
WHERE [Condition] = 'unique value'
SELECT @val1, @val2

위의 예제에서 @ val1에는 이전 값이 있고 @ val2에는 이후 값이 있습니다. 트리거의 변경 사항이 val2에 없을 것으로 생각되므로 해당 경우 출력 테이블을 사용해야합니다. 가장 간단한 경우를 제외하고는 출력 테이블이 코드에서 더 읽기 쉽습니다.

열을 쉼표로 구분 된 목록으로 바꾸려면이 방법이 매우 유용합니다.

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list

감사! 이것은 내가 필요한 정보
Wizou

1
와! 당신이 할 수있는 줄 몰랐어요 SET @val2 = NextNum = NextNum + 1.
Sam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.