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?
SCOPE_IDENTITY
el valor de retorno de la función es decimal (38,0)¿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.
fuente
SCOPE_IDENTITY
es una función incorporada ... así que al hacerExecuteScalar('insert...; select scope_identity());
eso, devolverá un decimal de esa función en lugar del int esperado.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 clientefuente
int
peroSCOPE_IDENTITY()
por alguna razón devuelveSystem.Decimal
... LaOUTPUT
cláusula devuelve un número entero como se esperaba, ¡así que gracias!intente usar esto y obtendrá un número entero:
ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
fuente