2010-04-08 9 views
73

Vì vậy, tôi có một bảng với một cột nhận dạng là khóa chính, do đó, nó là một số nguyên. Vì vậy, tại sao SCOPE_IDENTITY() luôn trả về giá trị thập phân thay vì một int cho ứng dụng C# của tôi? Điều này thực sự khó chịu vì các giá trị thập phân sẽ không chuyển đổi thành các số nguyên trong C#, có nghĩa là bây giờ tôi phải viết lại một loạt các công cụ và có rất nhiều phương thức trợ giúp vì tôi sử dụng SQL Server và Postgres, mà Postgres trả về một số nguyên cho hàm tương đương ..Tại sao chọn SCOPE_IDENTITY() trả lại một số thập phân thay vì một số nguyên?

Tại sao SCOPE_IDENTITY() không chỉ trả về một số nguyên đơn giản? Có những người ngoài kia thường sử dụng các giá trị thập phân/không nhận dạng cho các khóa chính không?

Trả lời

84

Trong SQL Server, IDENTITY bất động sản có thể được gán cho tinyint, smallint, int, bigint, decimal(p, 0) hoặc numeric(p, 0) cột. Do đó, hàm SCOPE_IDENTITY phải trả về kiểu dữ liệu có thể bao gồm tất cả các điều trên.

Như câu trả lời trước đã nói, chỉ cần đưa nó vào int trên máy chủ trước khi trả lại, sau đó ADO.NET sẽ phát hiện loại của nó như bạn mong đợi.

+1

Tôi không biết bạn có thể có bất cứ điều gì ngoài int và bigint cho khóa chính .. – Earlz

+0

Giá trị trả về hàm 'SCOPE_IDENTITY' là *** decimal (38,0) *** – Kiquenet

27

Bạn không thể bỏ nó trước khi trả lại từ truy vấn của bạn hoặc lưu trữ proc (SPs luôn luôn trở lại int anyway, nhưng có thể bạn đang sử dụng một tham số đầu ra)?

Giống như SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

Và tại sao lại thực hiện việc này? Có thể linh hoạt hơn và xử lý các số lớn hơn.

+0

'SCOPE_IDENTITY' là một xây dựng trong chức năng .. vì vậy khi làm như 'ExecuteScalar (' chèn ...; chọn SCOPE_IDENTITY()) ; 'nó sẽ trả về một số thập phân từ hàm đó chứ không phải int mong đợi. – Earlz

+0

@Earlz, vì vậy hãy thay đổi SQL thành ExecuteScalar ('chèn ...; chọn CAST (scope_identity() AS int)'); –

3

Scope identity giá trị trả về là số thập phân (38,0)

CAST nó, sử dụng mệnh đề OUTPUT, hoặc gán cho một tham số đầu ra chứ không phải là SELECT SCOPE_IDENTITY() cho khách hàng

3

hãy thử sử dụng này và bạn sẽ nhận được một số nguyên sau:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');