Warum gibt select SCOPE_IDENTITY () eine Dezimalzahl anstelle einer Ganzzahl zurück?

90

Ich habe also eine Tabelle mit einer Identitätsspalte als Primärschlüssel, also ist es eine Ganzzahl. Warum gibt SCOPE_IDENTITY()meine C # -Anwendung immer einen Dezimalwert anstelle eines int zurück? Dies ist sehr ärgerlich, da Dezimalwerte in C # nicht implizit in Ganzzahlen konvertiert werden. Dies bedeutet, dass ich jetzt eine Reihe von Dingen neu schreiben und viele Hilfsmethoden verwenden muss, da ich SQL Server und Postgres verwende, für die Postgres eine Ganzzahl zurückgibt äquivalente Funktion ..

Warum wird SCOPE_IDENTITY()nicht einfach eine einfache Ganzzahl zurückgegeben? Gibt es Leute da draußen, die üblicherweise Dezimal- / Nichtidentitätswerte für Primärschlüssel verwenden?

Earlz
quelle

Antworten:

106

In SQL Server, das IDENTITYkann Eigenschaft zugeordnet werden tinyint, smallint, int, bigint, decimal(p, 0), oder numeric(p, 0)Spalten. Daher muss die SCOPE_IDENTITYFunktion einen Datentyp zurückgeben, der alle oben genannten Funktionen umfassen kann.

Wie bereits in früheren Antworten erwähnt, wird es intvor der Rückgabe einfach auf den Server übertragen, und ADO.NET erkennt den Typ wie erwartet.

Christian Hayter
quelle
2
SCOPE_IDENTITYFunktionsrückgabewert ist dezimal (38,0)
Kiquenet
36

Können Sie es nicht einfach umwandeln, bevor Sie es von Ihrer Abfrage oder Ihrem gespeicherten Prozess zurückgeben (SPs geben trotzdem immer int zurück, aber vielleicht verwenden Sie einen Ausgabeparameter)?

Mögen SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

Und warum macht es das? Wahrscheinlich, um flexibler zu sein und mit größeren Zahlen umzugehen.

Cade Roux
quelle
SCOPE_IDENTITYist eine eingebaute Funktion. Wenn ExecuteScalar('insert...; select scope_identity());Sie also so vorgehen , wird von dieser Funktion eine Dezimalstelle anstelle des erwarteten int zurückgegeben.
Earlz
@Earlz, also ändern Sie die SQL in ExecuteScalar ('Einfügen ...; wählen Sie CAST (scope_identity () AS int)');
Cade Roux
4

Der Rückgabewert für die Bereichsidentität ist dezimal (38,0).

CAST it, verwenden Sie die OUTPUT-Klausel oder weisen Sie einen Ausgabeparameter anstelle SELECT SCOPE_IDENTITY()des Clients zu

gbn
quelle
In meinem Fall hat die Spalte den Datentyp, gibt intaber SCOPE_IDENTITY()aus irgendeinem Grund zurück System.Decimal... Die OUTPUTKlausel gibt wie erwartet eine Ganzzahl zurück, also danke!
Erik Barke
3

Wenn Sie dies verwenden, erhalten Sie eine Ganzzahl zurück:

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