Pourquoi select SCOPE_IDENTITY () renvoie-t-il une décimale au lieu d'un entier?

90

J'ai donc une table avec une colonne d'identité comme clé primaire, donc c'est un entier. Alors, pourquoi SCOPE_IDENTITY()renvoie toujours une valeur décimale au lieu d'un int à mon application C #? C'est vraiment ennuyeux car les valeurs décimales ne seront pas implicitement converties en nombres entiers en C #, ce qui signifie que je dois maintenant réécrire un tas de choses et avoir beaucoup de méthodes d'assistance car j'utilise SQL Server et Postgres, que Postgres renvoie un entier pour le fonction équivalente ..

Pourquoi ne SCOPE_IDENTITY()renvoie- t-il pas simplement un entier brut? Existe-t-il des personnes qui utilisent couramment des valeurs décimales / non d'identité pour les clés primaires?

Earlz
la source

Réponses:

106

Dans SQL Server, la IDENTITYpropriété peut être attribué à tinyint, smallint, int, bigint, decimal(p, 0)ou numeric(p, 0)colonnes. Par conséquent, la SCOPE_IDENTITYfonction doit renvoyer un type de données qui peut englober tout ce qui précède.

Comme les réponses précédentes l'ont dit, il suffit de le convertir intsur le serveur avant de le renvoyer, puis ADO.NET détectera son type comme prévu.

Christian Hayter
la source
2
SCOPE_IDENTITYla valeur de retour de la fonction est décimale (38,0)
Kiquenet
36

Ne pouvez-vous pas simplement le lancer avant de le renvoyer à partir de votre requête ou de votre proc stocké (les SP retournent toujours int de toute façon, mais vous utilisez peut-être un paramètre de sortie)?

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

Et pourquoi fait-il cela? Probablement pour être plus flexible et gérer des nombres plus importants.

Cade Roux
la source
SCOPE_IDENTITYest une fonction intégrée .. donc, en faisant comme ExecuteScalar('insert...; select scope_identity());ça, il retournera un décimal de cette fonction plutôt que le entier attendu.
Earlz
@Earlz, changez donc le SQL en ExecuteScalar ('insert ...; select CAST (scope_identity () AS int)');
Cade Roux
4

La valeur de retour d' identité d'étendue est décimale (38,0)

CAST, utilisez la clause OUTPUT ou affectez-le à un paramètre de sortie plutôt qu'au SELECT SCOPE_IDENTITY()client

gbn
la source
Dans mon cas, la colonne a le type de données intmais SCOPE_IDENTITY()pour une raison quelconque renvoie System.Decimal... La OUTPUTclause renvoie un entier comme prévu, alors merci!
Erik Barke
3

essayez d'utiliser ceci et vous obtiendrez un entier:

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