Perché select SCOPE_IDENTITY () restituisce un decimale invece di un numero intero?


90

Quindi ho una tabella con una colonna Identity come chiave primaria, quindi è un numero intero. Quindi, perché SCOPE_IDENTITY()restituisce sempre un valore decimale invece di un int alla mia applicazione C #? Questo è davvero fastidioso poiché i valori decimali non verranno convertiti implicitamente in numeri interi in C #, il che significa che ora devo riscrivere un sacco di cose e avere molti metodi di supporto perché uso SQL Server e Postgres, che Postgres restituisce un numero intero per il funzione equivalente ..

Perché non SCOPE_IDENTITY()restituisce solo un intero normale? Ci sono persone là fuori che usano comunemente valori decimali / non di identità per le chiavi primarie?

Risposte:


106

In SQL Server, la IDENTITYproprietà può essere assegnata a tinyint, smallint, int, bigint, decimal(p, 0), o numeric(p, 0)colonne. Pertanto la SCOPE_IDENTITYfunzione deve restituire un tipo di dati che può comprendere tutto quanto sopra.

Come hanno detto le risposte precedenti, basta trasmetterlo al intserver prima di restituirlo, quindi ADO.NET rileverà il suo tipo come previsto.


2
SCOPE_IDENTITYil valore restituito dalla funzione è decimale (38,0)
Kiquenet

36

Non puoi semplicemente lanciarlo prima di restituirlo dalla tua query o stored proc (SPs restituiscono sempre int comunque, ma forse stai usando un parametro di output)?

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

E perché lo fa? Probabilmente per essere più flessibili e gestire numeri più grandi.


SCOPE_IDENTITYè una funzione incorporata .. quindi quando si fa così ExecuteScalar('insert...; select scope_identity());restituirà un decimale da quella funzione piuttosto che il previsto int.
Earlz

@Earlz, quindi cambia l'SQL in ExecuteScalar ('inserisci ...; seleziona CAST (scope_identity () AS int)');
Cade Roux

4

Il valore restituito dall'identità dell'ambito è decimale (38,0)

Lanciarlo, utilizzare la clausola OUTPUT o assegnarlo a un parametro di output anziché SELECT SCOPE_IDENTITY()al client


Nel mio caso la colonna ha il tipo di dati intma SCOPE_IDENTITY()per qualche motivo ritorna System.Decimal... La OUTPUTclausola restituisce un numero intero come previsto, quindi grazie!
Erik Barke

3

prova a usarlo e riceverai un numero intero:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.