Mengapa memilih SCOPE_IDENTITY () mengembalikan desimal alih-alih integer?

90

Jadi saya memiliki tabel dengan kolom identitas sebagai kunci utama, jadi ini adalah bilangan bulat. Jadi, mengapa SCOPE_IDENTITY()selalu mengembalikan nilai desimal daripada int ke aplikasi C # saya? Ini benar-benar menjengkelkan karena nilai desimal tidak akan secara implisit dikonversi menjadi bilangan bulat di C #, yang berarti saya sekarang harus menulis ulang banyak hal dan memiliki banyak metode pembantu karena saya menggunakan SQL Server dan Postgres, yang mana Postgres mengembalikan integer untuk fungsi yang setara ..

Mengapa SCOPE_IDENTITY()tidak hanya mengembalikan bilangan bulat biasa? Apakah ada orang di luar sana yang biasanya menggunakan nilai desimal / non-identitas untuk kunci utama?

Earlz
sumber

Jawaban:

106

Dalam SQL Server, IDENTITYproperti dapat ditugaskan untuk tinyint, smallint, int, bigint, decimal(p, 0), atau numeric(p, 0)kolom. Oleh karena itu, SCOPE_IDENTITYfungsi tersebut harus mengembalikan tipe data yang dapat mencakup semua hal di atas.

Seperti jawaban sebelumnya, cukup masukkan ke intserver sebelum mengembalikannya, lalu ADO.NET akan mendeteksi jenisnya seperti yang Anda harapkan.

Christian Hayter
sumber
2
SCOPE_IDENTITYnilai hasil fungsi adalah desimal (38,0)
Kiquenet
36

Tidak bisakah Anda memasukkannya sebelum mengembalikannya dari kueri atau menyimpan proc (SPs selalu mengembalikan int, tapi mungkin Anda menggunakan parameter keluaran)?

Suka SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

Dan mengapa ini terjadi? Mungkin lebih fleksibel dan menangani jumlah yang lebih besar.

Cade Roux
sumber
SCOPE_IDENTITYadalah fungsi bawaan .. jadi ketika melakukan seperti ExecuteScalar('insert...; select scope_identity());itu akan mengembalikan desimal dari fungsi itu daripada int yang diharapkan.
Earlz
@Earlz, jadi ubah SQL menjadi ExecuteScalar ('insert ...; pilih CAST (scope_identity () AS int)');
Cade Roux
4

Nilai kembali identitas lingkup adalah desimal (38,0)

CAST, gunakan klausa OUTPUT, atau tetapkan ke parameter output daripada SELECT SCOPE_IDENTITY()ke klien

gbn
sumber
Dalam kasus saya kolom memiliki tipe data inttetapi SCOPE_IDENTITY()untuk beberapa alasan mengembalikan System.Decimal... OUTPUTKlausa mengembalikan integer seperti yang diharapkan, jadi terima kasih!
Erik Barke
3

coba gunakan ini dan Anda akan mendapatkan integer kembali:

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