2010-04-08 10 views
73

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

Perché SCOPE_IDENTITY() non restituisce solo un numero intero semplice? Ci sono persone là fuori che usano comunemente valori decimali/non identificati per chiavi primarie?

risposta

84

In SQL Server, la proprietà IDENTITY può essere assegnato alle colonne tinyint, smallint, int, bigint, decimal(p, 0) o numeric(p, 0). Pertanto la funzione SCOPE_IDENTITY deve restituire un tipo di dati che può comprendere tutto quanto sopra.

Come le risposte precedenti hanno detto, basta lanciarlo su int sul server prima di restituirlo, quindi ADO.NET rileverà il suo tipo come previsto.

+1

Non sapevo che potevi avere altro che int e bigint per una chiave primaria .. – Earlz

+0

Il valore di ritorno della funzione 'SCOPE_IDENTITY' è *** decimale (38,0) *** – Kiquenet

27

Non è possibile eseguire il cast solo prima di restituirlo dalla query o dal processo memorizzato (SP alway return int in ogni caso, ma forse si sta utilizzando un parametro di output)?

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

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

+0

'SCOPE_IDENTITY' è una costruito in funzione .. quindi quando si fa come' ExecuteScalar ('inserto ...; selezionare SCOPE_IDENTITY()) ; 'restituirà un decimale da quella funzione piuttosto che l'int previsto. – Earlz

+0

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

3

Scope identity valore di ritorno è decimale (38,0)

CAST esso, utilizzare la clausola OUTPUT, o assegnare a un parametro di output anziché SELECT SCOPE_IDENTITY() al client

3

tenta di utilizzare questo e si otterrà un numero intero di nuovo:

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