¿Por qué select SCOPE_IDENTITY () devuelve un decimal en lugar de un entero?

90

Entonces tengo una tabla con una columna de identidad como clave principal, por lo que es un número entero. Entonces, ¿por qué SCOPE_IDENTITY()siempre devuelve un valor decimal en lugar de un int a mi aplicación C #? Esto es realmente molesto ya que los valores decimales no se convertirán implícitamente a enteros en C #, lo que significa que ahora tengo que reescribir un montón de cosas y tener muchos métodos auxiliares porque uso SQL Server y Postgres, que Postgres devuelve un entero para el función equivalente ..

¿Por qué SCOPE_IDENTITY()no devuelve simplemente un número entero? ¿Hay personas que usen comúnmente valores decimales / sin identidad para claves primarias?

Earlz
fuente

Respuestas:

106

En SQL Server, la IDENTITYpropiedad puede ser asignado a tinyint, smallint, int, bigint, decimal(p, 0), o numeric(p, 0)columnas. Por lo tanto, la SCOPE_IDENTITYfunción debe devolver un tipo de datos que pueda abarcar todo lo anterior.

Como han dicho las respuestas anteriores, simplemente envíelo al intservidor antes de devolverlo, luego ADO.NET detectará su tipo como espera.

Christian Hayter
fuente
2
SCOPE_IDENTITYel valor de retorno de la función es decimal (38,0)
Kiquenet
36

¿No puede simplemente lanzarlo antes de devolverlo desde su consulta o proceso almacenado (los SP siempre devuelven int de todos modos, pero tal vez esté usando un parámetro de salida)?

Me gusta SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

¿Y por qué hace esto? Probablemente para ser más flexible y manejar números más grandes.

Cade Roux
fuente
SCOPE_IDENTITYes una función incorporada ... así que al hacer ExecuteScalar('insert...; select scope_identity());eso, devolverá un decimal de esa función en lugar del int esperado.
Earlz
@Earlz, así que cambie el SQL a ExecuteScalar ('insert ...; select CAST (scope_identity () AS int)');
Cade Roux
4

El valor de retorno de la identidad del ámbito es decimal (38,0)

CAST it, use la cláusula OUTPUT o asigne a un parámetro de salida en lugar SELECT SCOPE_IDENTITY()del cliente

gbn
fuente
En mi caso, la columna tiene el tipo de datos intpero SCOPE_IDENTITY()por alguna razón devuelve System.Decimal... La OUTPUTcláusula devuelve un número entero como se esperaba, ¡así que gracias!
Erik Barke
3

intente usar esto y obtendrá un número entero:

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