Dlaczego metoda select SCOPE_IDENTITY () zwraca liczbę dziesiętną zamiast liczby całkowitej?

90

Mam więc tabelę z kolumną tożsamości jako kluczem podstawowym, więc jest to liczba całkowita. Dlaczego więc SCOPE_IDENTITY()zawsze zwraca wartość dziesiętną zamiast int do mojej aplikacji C #? Jest to naprawdę denerwujące, ponieważ wartości dziesiętne nie będą niejawnie konwertowane na liczby całkowite w C #, co oznacza, że ​​muszę teraz przepisać kilka rzeczy i mieć wiele metod pomocniczych, ponieważ używam SQL Server i Postgres, które Postgres zwraca liczbę całkowitą dla równoważna funkcja ..

Dlaczego SCOPE_IDENTITY()po prostu nie zwraca zwykłej liczby całkowitej? Czy są ludzie, którzy często używają wartości dziesiętnych / nieidentyfikujących dla kluczy głównych?

Earlz
źródło

Odpowiedzi:

106

W SQL Server, IDENTITYnieruchomość może być przypisany do tinyint, smallint, int, bigint, decimal(p, 0), lub numeric(p, 0)kolumnach. Dlatego SCOPE_IDENTITYfunkcja musi zwracać typ danych, który może obejmować wszystkie powyższe elementy.

Jak powiedziały poprzednie odpowiedzi, po prostu przerzuć go intna serwer przed zwróceniem, a ADO.NET wykryje jego typ zgodnie z oczekiwaniami.

Christian Hayter
źródło
2
SCOPE_IDENTITYwartość zwracana funkcji jest dziesiętna (38,0)
Kiquenet
36

Czy nie możesz go po prostu przesłać przed zwróceniem go z zapytania lub zapisanego procesu (SP i tak zawsze zwracają int, ale może używasz parametru wyjściowego)?

Lubić SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

A dlaczego to robi? Prawdopodobnie jest bardziej elastyczny i obsługuje większe liczby.

Cade Roux
źródło
SCOPE_IDENTITYjest funkcją wbudowaną ... więc gdy robisz ExecuteScalar('insert...; select scope_identity());to, zwróci wartość dziesiętną z tej funkcji, a nie oczekiwaną liczbę int.
Earlz,
@Earlz, więc zmień kod SQL na ExecuteScalar ('insert ...; select CAST (scope_identity () AS int)');
Cade Roux
4

Wartość zwracana tożsamości zakresu jest dziesiętna (38,0)

CAST, użyj klauzuli OUTPUT lub przypisz do parametru wyjściowego zamiast SELECT SCOPE_IDENTITY()do klienta

gbn
źródło
W moim przypadku kolumna ma typ danych, intale SCOPE_IDENTITY()z jakiegoś powodu zwraca System.Decimal... OUTPUTKlauzula zwraca liczbę całkowitą zgodnie z oczekiwaniami, więc dzięki!
Erik Barke
3

spróbuj tego użyć, a otrzymasz z powrotem liczbę całkowitą:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
KM.
źródło