SCOPE_IDENTITY () seçimi neden bir tamsayı yerine ondalık sayı döndürüyor?


91

Bu yüzden birincil anahtar olarak kimlik sütununa sahip bir tablom var, bu yüzden bir tamsayı. Öyleyse, SCOPE_IDENTITY()C # uygulamama neden her zaman int yerine ondalık değer döndürüyor? Bu gerçekten can sıkıcı çünkü ondalık değerler C # 'da örtük olarak tamsayılara dönüştürülmeyecek, bu da artık bir sürü şeyi yeniden yazmam gerektiği ve birçok yardımcı yönteme sahip olduğum anlamına geliyor çünkü SQL Server ve Postgres kullanıyorum, Postgres bunun için bir tamsayı döndürüyor eşdeğer işlev ..

Neden SCOPE_IDENTITY()sadece düz bir tamsayı döndürmüyor? Birincil anahtarlar için yaygın olarak ondalık / kimlik dışı değerler kullanan insanlar var mı?

Yanıtlar:


106

SQL Server, IDENTITYmülkiyet atanabilir tinyint, smallint, int, bigint, decimal(p, 0), veya numeric(p, 0)sütunların. Bu nedenle, SCOPE_IDENTITYişlevin yukarıdakilerin tümünü kapsayan bir veri türü döndürmesi gerekir.

Önceki yanıtların söylediği gibi, intiade etmeden önce onu sunucuya yayınlayın, ardından ADO.NET beklediğiniz gibi türünü algılayacaktır.


2
SCOPE_IDENTITYişlev dönüş değeri
ondalıktır

37

Sorgunuzdan veya depolanmış proc'tan dönmeden önce onu çeviremez misiniz (SP'ler yine de int'i döndürür, ancak belki bir çıktı parametresi kullanıyorsunuzdur)?

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

Ve bunu neden yapıyor? Muhtemelen daha esnek olmak ve daha büyük sayıları işlemek için.


SCOPE_IDENTITYyerleşik bir işlevdir .. bu nedenle, böyle yaptığında ExecuteScalar('insert...; select scope_identity());, bu işlevden beklenen int yerine bir ondalık döndürür.
Earlz

@Earlz, bu yüzden SQL'i ExecuteScalar olarak değiştirin ('insert ...; CAST (kapsam_kimliği () AS int)');
Cade Roux 08

4

Kapsam kimliği dönüş değeri ondalık (38,0)

CAST it, OUTPUT cümlesini kullanın veya SELECT SCOPE_IDENTITY()istemci yerine bir çıktı parametresine atayın


Benim durumumda sütun veri türüne sahip intancak SCOPE_IDENTITY()bazı nedenlerden dolayı geri dönüyor System.Decimal... OUTPUTMadde beklendiği gibi bir tamsayı döndürüyor, bu yüzden teşekkürler!
Erik Barke

3

bunu kullanmayı deneyin ve bir tamsayı geri alacaksınız:

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

0

Bu, sorulan soruya tam bir cevap değil, ancak yukarıdaki cevaplar damarına göre (T-SQL - MS SQLServer'da):

dönüştürmeyi seçin (bigint, SCOPE_IDENTITY ())

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.