[SQL] @@ IDENTITY, SCOPE_IDENTITY (), 출력 된 마지막 ID를 검색하는 다른 방법
SQL@@ IDENTITY, SCOPE_IDENTITY (), 출력 된 마지막 ID를 검색하는 다른 방법
나는 삽입 후 기본 키 정체성 필드의 값을 검색 할 때 사용하는 다양한 방법을 보았다.
declare @t table (
id int identity primary key,
somecol datetime default getdate()
)
insert into @t
default values
select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1
삽입 다음과 정체성의 테이블을 반환 :
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
어떤 방법은 적절한 또는 더 나은 무엇입니까? 출력 방법 범위 안전인가?
두 번째 코드는 야생에서 SQL에서 차용되었다
해결법
-
==============================
1.그것은 당신이 무엇을하려는 지에 따라 달라집니다 ...
그것은 당신이 무엇을하려는 지에 따라 달라집니다 ...
@@정체
반환에 관계없이 관계없이 값을 생성 한 Statement의 범위의 값을 생성하고 테이블의 연결에서 생성 된 마지막 ID 값. @@ IDENTITY는 현재 세션의 테이블에 입력 된 마지막 ID 값을 반환합니다. @@ IDENTITY 현재 세션에 한정되어 현재의 범위에 한정되지 않는다. 당신은 신원이 다른 테이블에 작성되도록 테이블에 트리거가있는 경우 예를 들어, 당신은 그것을 만든 트리거 경우에도, 마지막으로 생성 된 ID를 얻을 것이다.
SCOPE_IDENTITY ()
에 관계없이 값을 생성 한 테이블에, 연결과 같은 범위의 문에 의해 생성 된 마지막 ID 값을 반환합니다. SCOPE_IDENTITY는 ()에 @@ IDENTITY와 유사하지만, 그것은 또한 당신의 현재 범위에 값을 제한합니다. 즉, 오히려 트리거 또는 사용자 정의 함수에 의해 생성 된 어떤 정체성을보다 명시 적으로 생성 된 마지막 ID 값을 반환합니다.
IDENT_CURRENT ()
테이블에서 생성 된 마지막 IDENTITY 값에 관계없이 값을 생성 한 Statement의 연결 및 범위를 돌려줍니다. IDENT_CURRENT는 있지만 연결 또는 범위에 의해, 지정된 테이블로 제한됩니다.
-
==============================
2.SCOPE_IDENTITY (에 버그가 있다는 사실 주)와 @@ IDENTITY - 참조 MS 연결 : https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
SCOPE_IDENTITY (에 버그가 있다는 사실 주)와 @@ IDENTITY - 참조 MS 연결 : https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
(마이크로 소프트)에서 인용 한 :
추가로 편집이 이제 고정 될 수있다. 연결은 나에게 오류를 제공하지만, 볼 수 있습니다 :
잘못된 값을 반환 SCOPE_IDENTITY ()는 고정?
-
==============================
3.행 (들)의 신원 방금 삽입을 얻으려고 노력하는 출력 절 외에 사용 아무것도 거의없는 이유가있다. OUTPUT 절은 범위와 테이블 안전합니다.
행 (들)의 신원 방금 삽입을 얻으려고 노력하는 출력 절 외에 사용 아무것도 거의없는 이유가있다. OUTPUT 절은 범위와 테이블 안전합니다.
여기에 하나의 행을 삽입 한 후 ID를 얻기의 간단한 예입니다 ...
DECLARE @Inserted AS TABLE (MyTableId INT); INSERT [MyTable] (MyTableColOne, MyTableColTwo) OUTPUT Inserted.MyTableId INTO @Inserted VALUES ('Val1','Val2') SELECT MyTableId FROM @Inserted
OUTPUT 절에 대한 자세한 문서 : http://technet.microsoft.com/en-us/library/ms177564.aspx
-- table structure for example: CREATE TABLE MyTable ( MyTableId int NOT NULL IDENTITY (1, 1), MyTableColOne varchar(50) NOT NULL, MyTableColTwo varchar(50) NOT NULL )
-
==============================
4.@@ IDENTITY는 오래된 학교 방법입니다. 모든 경우에 사용 SCOPE_IDENTITY ()는 앞으로. @@ IDENTITY 사용의 영향에 대한 MSDN을 참조하십시오 (그들이있는 거 나쁜!).
@@ IDENTITY는 오래된 학교 방법입니다. 모든 경우에 사용 SCOPE_IDENTITY ()는 앞으로. @@ IDENTITY 사용의 영향에 대한 MSDN을 참조하십시오 (그들이있는 거 나쁜!).
-
==============================
5.SCOPE_IDENTITY는 단일 행에 대한 충분하고 어떤 이유로 중간 TRIGGER의 결과를 볼 필요가 경우를 제외하고 권장합니다 (왜?).
SCOPE_IDENTITY는 단일 행에 대한 충분하고 어떤 이유로 중간 TRIGGER의 결과를 볼 필요가 경우를 제외하고 권장합니다 (왜?).
여러 행의 경우, OUTPUT / OUTPUT INTO는 당신의 새로운 가장 친한 친구와 다시 찾는 행을 다른 테이블에 삽입하는 대안이다.
-
==============================
6.야생에서 SQL에 설명되어 SQL 서버 2005에서 사용할 수있는 다른 방법이있다.
야생에서 SQL에 설명되어 SQL 서버 2005에서 사용할 수있는 다른 방법이있다.
이것은 당신이 삽입 한 후 여러 ID를 검색 할 수 있습니다. 여기에 블로그 게시물의 코드는 다음과 같습니다
Create Table #Testing ( id int identity, somedate datetime default getdate() ) insert into #Testing output inserted.* default values
-
==============================
7.Godeke의 대답에 작은 수정 :
Godeke의 대답에 작은 수정 :
그냥 아니라 당신에 대해 걱정할 필요가 트리거합니다. 원인 식별자가 생성 될 수 있도록 저장 프록 중첩 된 동작, 어떤 종류 @@ IDENTITY의 값을 변경할 수있다.
SCOPE_IDENTITY에 대한 또 다른 투표 ...
-
==============================
8.@@ IDENTITY를 사용하는 동안주의해야 ...
@@ IDENTITY를 사용하는 동안주의해야 ...
http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/
from https://stackoverflow.com/questions/481395/identity-scope-identity-output-and-other-methods-of-retrieving-last-identi by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL - 쿼리 서버의 IP 주소를 얻을 수 있습니다 (0) | 2020.04.18 |
---|---|
[SQL] 삽입, 업데이트 SQL Server에서 proc 디렉토리에 저장 (0) | 2020.04.18 |
[SQL] 집계 함수없이 GROUP BY (0) | 2020.04.18 |
[SQL] EXECUTE 후 트랜잭션 개수가 일치하지 않는 BEGIN 및 COMMIT 문을 수를 나타냅니다. 이전 카운트 = 1, 현재 카운트 = 0 (0) | 2020.04.18 |
[SQL] SQL보기 : 전체 이름 필드에서, 첫 번째 중간 이름과 성을 구문 분석 (0) | 2020.04.18 |