Tại sao chọn SCOPE_IDENTITY () trả về số thập phân thay vì số nguyên?


90

Vì vậy, tôi có một bảng với cột nhận dạng là khóa chính, vì vậy 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ì 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 hoàn toàn chuyển đổi thành số nguyên trong C #, có nghĩa là bây giờ tôi phải viết lại rất nhiều thứ và có rất nhiều phương thức trợ giúp bởi vì tôi sử dụng SQL Server và Postgres, Postgres trả về một số nguyên cho chức năng tương đương ..

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

Câu trả lời:


106

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

Như các câu trả lời trước đã nói, chỉ cần truyền nó đến intmá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.


2
SCOPE_IDENTITYgiá trị hàm trả về là số thập phân (38,0)
Kiquenet

36

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

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

Và tại sao nó làm được điều này? Có thể là để linh hoạt hơn và xử lý số lượng lớn hơn.


SCOPE_IDENTITYlà một hàm tích hợp sẵn .. vì vậy khi làm như ExecuteScalar('insert...; select scope_identity());vậy nó sẽ trả về một số thập phân từ hàm đó chứ không phải là số nguyên mong đợi.
Earlz

@Earlz, vì vậy hãy thay đổi SQL thành ExecuteScalar ('insert ...; select CAST (scope_identity () AS int)');
Cade Roux

4

Giá trị trả về nhận dạng phạm vi là số thập phân (38,0)

ĐÚC nó, sử dụng mệnh đề OUTPUT hoặc gán cho một tham số đầu ra thay vì SELECT SCOPE_IDENTITY()cho máy khách


Trong trường hợp của tôi, cột có kiểu dữ liệu intnhưng SCOPE_IDENTITY()vì lý do nào đó trả về System.Decimal... OUTPUTMệnh đề trả về một số nguyên như mong đợi, vì vậy cảm ơn!
Erik Barke

3

hãy thử sử dụng điều này và bạn sẽ nhận lại một số nguyên:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.