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?

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.


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.


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


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())');
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.