Wiem Scope_Identity()
, Identity()
, @@Identity
, i Ident_Current()
wszyscy się wartość kolumny tożsamości, ale chciałbym, aby znać różnicę.
Częścią moich kontrowersji jest to, co rozumieją przez zakres w odniesieniu do powyższych funkcji?
Chciałbym również prosty przykład różnych scenariuszy ich używania?
sql
sql-server
identity
Tebo
źródło
źródło
Odpowiedzi:
@@identity
Funkcja zwraca ostatni tożsamości utworzony w tej samej sesji.scope_identity()
Funkcja zwraca ostatni tożsamości utworzony w tej samej sesji i tego samego zakresu.ident_current(name)
Zwraca ostatni tożsamość stworzoną dla konkretnej tabeli lub widoku w każdej sesji.identity()
Funkcja nie jest używana, aby uzyskać tożsamość, jest używany do tworzenia tożsamości wselect...into
zapytaniu.Sesja jest połączeniem z bazą danych. Zakres jest bieżącym zapytaniem lub bieżącą procedurą składowaną.
Sytuacja, w której
scope_identity()
i@@identity
funkcje różnią się, to jeśli masz spust na stole. Jeśli masz zapytanie, które wstawia rekord, powodując, że wyzwalacz wstawi gdzieś inny rekord,scope_identity()
funkcja zwróci tożsamość utworzoną przez zapytanie, a@@identity
funkcja zwróci tożsamość utworzoną przez wyzwalacz.Więc normalnie użyłbyś tej
scope_identity()
funkcji.źródło
Dobre pytanie.
@@IDENTITY
: zwraca ostatnią wartość tożsamości wygenerowaną dla połączenia SQL (SPID). Przez większość czasu będzie to, czego chcesz, ale czasami tak nie jest (na przykład, gdy wyzwalacz jest uruchamiany w odpowiedzi naINSERT
, a wyzwalacz wykonuje innąINSERT
instrukcję).SCOPE_IDENTITY()
: zwraca ostatnią wartość tożsamości wygenerowaną w bieżącym zakresie (tj. procedura przechowywana, wyzwalacz, funkcja itp.).IDENT_CURRENT()
: zwraca ostatnią wartość tożsamości dla określonej tabeli. Nie używaj tego, aby uzyskać wartość tożsamości zINSERT
, zależy to od warunków wyścigu (tj. Wiele połączeń wstawia wiersze na tym samym stole).IDENTITY()
: używane, gdy deklarujemy kolumnę w tabeli jako kolumnę tożsamości.Więcej informacji można znaleźć na stronie: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Podsumowując: jeśli wstawianie wierszy, a chcesz poznać wartość kolumny tożsamości dla rzędu ty po prostu wstawiony, zawsze używać
SCOPE_IDENTITY()
.źródło
Jeśli zrozumiesz różnicę między zakresem a sesją, zrozumienie tych metod będzie bardzo łatwe.
Bardzo ładny post na blogu autorstwa Adama Andersona opisuje tę różnicę:
Zatem różnice między trzema metodami wyszukiwania tożsamości są następujące:
źródło
Zakres oznacza kontekst kodu, który wykonuje
INSERT
instrukcjęSCOPE_IDENTITY()
, w przeciwieństwie do globalnego zakresu@@IDENTITY
.Daje różne wyniki.
źródło
Z powodu błędu wspomnianego przez @David Freitas oraz z powodu niezgodności z nową funkcją Sekwencji, która została wprowadzona w 2012 roku, polecam trzymać się z daleka od tych wszystkich trzech. Zamiast tego możesz użyć klauzuli OUTPUT, aby uzyskać wstawioną wartość tożsamości. Inną zaletą jest to, że WYJŚCIE działa nawet, jeśli wstawiono więcej niż jeden wiersz.
Szczegółowe informacje i przykłady można znaleźć tutaj: kryzys tożsamości
źródło
Aby wyjaśnić problem z
@@Identity
:Na przykład, jeśli wstawisz tabelę i ta tabela ma wyzwalacze wykonujące wstawki,
@@Identity
zwróci identyfikator z wstawki w wyzwalaczu (alog_id
lub coś), ascope_identity()
zwróci identyfikator z wstawki w oryginalnej tabeli.Więc jeśli nie masz żadnych wyzwalaczy
scope_identity()
i@@identity
zwróci tę samą wartość. Jeśli masz wyzwalacze, musisz pomyśleć o tym, jaką wartość chcesz.źródło
Scope Identity
: Tożsamość ostatniego rekordu dodanego w ramach wykonywanej procedury składowanej.@@Identity
: Tożsamość ostatniego rekordu dodanego w partii zapytania lub w wyniku zapytania, np. Procedura, która wykonuje wstawianie, a następnie uruchamia wyzwalacz, który następnie wstawia rekord, zwróci tożsamość wstawionego rekordu z wyzwalacza.IdentCurrent
: Ostatnia tożsamość przydzielona dla tabeli.źródło
Oto kolejne dobre wyjaśnienie z książki :
źródło