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

Así que 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 en 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 solo devuelve un entero simple? ¿Hay personas que comúnmente usan valores decimales / no identitarios para las claves primarias?

En SQL Server, la propiedad IDENTITY se puede asignar a tinyint , smallint , int , bigint , decimal(p, 0) o numeric(p, 0) . Por lo tanto, la función SCOPE_IDENTITY debe devolver un tipo de datos que pueda abarcar todo lo anterior.

Como han dicho las respuestas anteriores, simplemente transfiéralo a int en el servidor antes de devolverlo, luego ADO.NET detectará su tipo como usted espera.

¿No puedes simplemente lanzarlo antes de devolverlo de tu consulta o de tu proc almacenado (los SPs siempre devuelven int de todos modos, pero tal vez estás usando un parámetro de salida)?

Al igual que 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.

El valor de retorno de identidad del scope es decimal (38,0)

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

intenta usar esto y obtendrás un entero de vuelta:

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