web-dev-qa-db-fra.com

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

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

Pourquoi SCOPE_IDENTITY() ne renvoie-t-il pas simplement un entier simple? Y a-t-il des gens qui utilisent couramment des valeurs décimales/de non-identité pour les clés primaires?

82
Earlz

Dans SQL Server, la propriété IDENTITY peut être affectée à tinyint, smallint, int, bigint, decimal(p, 0) ou numeric(p, 0) colonnes. Par conséquent, la SCOPE_IDENTITY La fonction 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 en int sur le serveur avant de le renvoyer, puis ADO.NET détectera son type comme vous vous y attendez.

97
Christian Hayter

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

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

Et pourquoi ça fait ça? Probablement pour être plus flexible et gérer de plus grands nombres.

30
Cade Roux

Identité de l'étendue la valeur de retour est décimale (38,0)

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

4
gbn

essayez de l'utiliser et vous obtiendrez un entier:

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