2012-02-21 2 views
2

이 아닙니다. asp.net 응용 프로그램의 백엔드로 SQL Server가 있습니다. 여러 사람이 '같은 시간에 동일한 테이블에 데이터를 삽입 할 수 있습니다 ...'. 내가 다른 사용자의 삽입의 ID를 얻을 수 있기 때문에 scope_identity vs ident_currentIDENT_CURRENT는 마지막 ID 값을 반환하지만 SCOPE_IDENTITY는

그때 나는 Ident_current을 사용해서는 안 : 나는이 게시물에서 솔루션/답을 읽어

.

그러나 Select Scope_Identity();을 사용하면 Select IDENT_CURRENT('tableName')이 SQL Server Management Studio에서 확인한 올바른 ID를 반환하는 동안 NULL을 반환합니다.

삽입 문은 SqlTransaction 안에 있습니다. 트랜잭션 후 Select IDENT_CURRENT('tableName')이 완료됩니다.

무엇이 잘못 되었나요?

UPDATE :

내 삽입 문을 동적으로 기본 클래스에 의해 함께 구축된다

INSERT INTO TEST (NAME) VALUES (@Name) 
명령의 매개 변수 컬렉션 값이 "XXX"모든 것이 잘 테이블에 삽입했다

.

나는 C#으로 순수 SqlDataReader이라는 저장 프로 시저를 사용하지 않습니다. 그것은 INSERT과 혼란 SELECT ...

+1

삽입 명령을 표시하십시오. 지난 주 비슷한 질문에 대한 내 대답 좀 봐, 아마도 도움이 : http://stackoverflow.com/questions/9319532/return-value-from-sql-server-insert-command-using-c-sharp/9319609 # 9319609 동일한 범위에서 scope_identity를 사용해야합니다. –

+2

아마도 두 명령을 완전히 독립적으로 실행했을 것입니다. –

+0

나는 그것들을 독립적으로 실행한다. – Pascal

답변

4

그냥 OUTPUT Clause (Transact-SQL)를 사용 때문에

commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();" 

어떻게 위의 문을 실행 마지막 자동 INC ID를 얻을 수 나는 위의 대한 ExecuteNonQuery 또는 ExecuteReader를 호출해야합니다 작업 예를

INSERT INTO TEST (NAME) OUTPUT INSERTED.YourIdentity VALUES (@Name) 

: 당신은 데이터를 삽입과 같은 명령문의 모든 (심지어 다수의) 정체성을 다시 선택할 수 있습니다

DECLARE @YourTable table (YourIdentity int identity(1,1) primary key, YourCol1 varchar(5)) 

INSERT INTO @YourTable (YourCol1) OUTPUT INSERTED.YourIdentity VALUES ('ABC') 

출력 :

YourIdentity 
------------ 
1 

(1 row(s) affected) 
+0

변수의 마지막 행 ID를 재사용하지 않는다면 읽을 필요가 없습니다. 귀하의 시나리오는 스토어 프로 시저에서 더 적절하다고 생각합니다. 하지만 그것은 Scope_Identiy와 동일하게 작동하므로 사용하지 않아도 해결할 수 있습니다 ;-) – Pascal

+0

내 예제에서는 ID를 변수에 넣지 않습니다! "작업 예제"코드는 변수 테이블을 생성하므로 행을 삽입하고 ID를 생성 할 수있는 곳이 있습니다. OUTPUT INSERTED.YourIdentity는 insert 문이 삽입 된 identity 값을 포함하는 결과 셋을 생성하게한다. 이 솔루션은 단일 INSERT를 사용하여 데이터를 삽입하고 ID 값을 선택합니다. 주석의 솔루션은 두 가지 명령을 사용하여 같은 결과를 얻습니다. 삽입물에 OUTPUT을 사용하면'; Select Scopy_Identity();'코드를 제거 할 수 있습니다. –

+0

테이블에 삽입 트리거가 있으면 오류가 발생합니다. 그런 다음'OUTPUT' 대신'OUTPUT INTO'을 사용해야합니다. –

11

IDENT_CURRENT는 임의의 세션과 범위에있는 특정 테이블에 대해 생성 된 마지막 ID 값을 반환합니다.

@@IDENTITY은 모든 범위에서 현재 세션의 테이블에 대해 생성 된 마지막 ID 값을 반환합니다.

SCOPE_IDENTITY은 현재 세션의 테이블과 현재 범위에 대해 생성 된 마지막 ID 값을 반환합니다.

관련 문제