select SCOPE_IDENTITY ()가 정수 대신 십진수를 반환하는 이유는 무엇입니까?


90

따라서 기본 키로 ID 열이있는 테이블이 있으므로 정수입니다. 그렇다면 왜 SCOPE_IDENTITY()항상 내 C # 응용 프로그램에 int 대신 십진수 값을 반환합니까? 이것은 십진수 값이 C #에서 암시 적으로 정수로 변환되지 않기 때문에 정말 성가신 일입니다. 즉, SQL Server와 Postgres를 사용하기 때문에 많은 항목을 다시 작성하고 많은 도우미 메서드를 가지고 있어야합니다. Postgres는이를 위해 정수를 반환합니다. 동등한 기능 ..

SCOPE_IDENTITY()일반 정수를 반환 하지 않는 이유는 무엇 입니까? 일반적으로 기본 키에 십진수 / 비 ID 값을 사용하는 사람들이 있습니까?

답변:


106

SQL Server에서 IDENTITY속성에 할당 할 수 있습니다 tinyint, smallint, int, bigint, decimal(p, 0), 또는 numeric(p, 0)열. 따라서 SCOPE_IDENTITY함수는 위의 모든 것을 포함 할 수있는 데이터 유형을 반환해야합니다.

이전 답변에서 말했듯이 int반환하기 전에 서버에서 캐스트하면 ADO.NET이 예상대로 유형을 감지합니다.


2
SCOPE_IDENTITY함수 반환 값은 소수 (38,0)
Kiquenet

36

쿼리 또는 저장된 proc에서 반환하기 전에 캐스팅 할 수 없습니까 (SP는 항상 int를 반환하지만 출력 매개 변수를 사용하고있을 수 있음)?

처럼 SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

그리고 왜 이렇게합니까? 아마도 더 유연하고 더 많은 수를 처리 할 것입니다.


SCOPE_IDENTITY는 내장 함수입니다. 그래서 그렇게하면 ExecuteScalar('insert...; select scope_identity());예상되는 정수가 아닌 해당 함수에서 십진수를 반환합니다.
Earlz

@Earlz, SQL을 ExecuteScalar ( 'insert ...; select CAST (scope_identity () AS int)');
Cade Roux

4

범위 ID 반환 값은 decimal (38,0)입니다.

CAST, OUTPUT 절 사용 또는 SELECT SCOPE_IDENTITY()클라이언트가 아닌 출력 매개 변수에 할당


제 경우에는 열에 데이터 유형이 int있지만 SCOPE_IDENTITY()어떤 이유로 든 반환합니다 System.Decimal... OUTPUT절은 예상대로 정수를 반환하므로 감사합니다!
Erik Barke

3

이것을 사용하면 정수를 다시 얻을 수 있습니다.

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.