Próbuję odzyskać klucz-wartość z powrotem po instrukcji INSERT. Przykład: Mam tabelę z nazwą atrybutu i identyfikatorem. id to wygenerowana wartość.
INSERT INTO table (name) VALUES('bob');
Teraz chcę odzyskać identyfikator w tym samym kroku. Jak to się robi?
Używamy Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbiczny
źródło
źródło
Odpowiedzi:
Nie ma potrzeby oddzielnego WYBIERZ ...
Działa to również w przypadku kolumn bez tożsamości (takich jak GUID)
źródło
Użyj,
SCOPE_IDENTITY()
aby uzyskać nową wartość identyfikatorahttp://msdn.microsoft.com/en-us/library/ms190315.aspx
źródło
id
to tożsamośćid
, więc tak.Jest najbezpieczniejszym zakładem, ponieważ istnieje znany problem z konfliktem klauzul OUTPUT w tabelach z wyzwalaczami. Sprawia, że jest to dość niewiarygodne, ponieważ nawet jeśli twoja tabela nie ma obecnie żadnych wyzwalaczy - ktoś dodając jeden w dół linii złamie twoją aplikację. Zachowanie związane z bombą zegarową.
Bardziej szczegółowe wyjaśnienia znajdują się w artykule msdn:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
źródło
Entity Framework wykonuje coś podobnego do odpowiedzi gbn:
Wyniki wyjściowe są przechowywane w tymczasowej zmiennej tabeli, a następnie wybierane z powrotem do klienta. Musisz być świadomy gotcha:
Nie mam pojęcia, dlaczego EF połączyłby efemeryczny stół z powrotem z prawdziwym stołem (w jakich okolicznościach te dwa nie pasowałyby).
Ale tak właśnie działa EF.
SQL Server 2008 lub nowszy. Jeśli jest 2005, to nie masz szczęścia.
źródło
Customer
rekordzie, ponieważ mogą mieć na to wpływ inne logiki po stronie DB, np. WDEFAULT
niektórych kolumnach, wyzwalacze w tabeli itp. EF aktualizuje encja (obiekt) użyta do wstawiania, więc strona klienta otrzymuje obiekt klienta z identyfikatorem i wszystkim innym, reprezentującym bieżący stan wiersza.@@IDENTITY
Jest funkcją systemową, która zwraca ostatnio wstawioną wartość tożsamości.źródło
Istnieje wiele sposobów wyjścia po wstawieniu
IDENT_CURRENT : Zwraca ostatnią tożsamość utworzoną dla określonej tabeli lub widoku w dowolnej sesji.
SCOPE_IDENTITY : Zwraca ostatnią tożsamość z tej samej sesji i tego samego zakresu. Zakres jest procedurą przechowywaną / wyzwalaczem itp.
@@ TOŻSAMOŚĆ : Zwraca ostatnią tożsamość z tej samej sesji.
źródło
out put
dlabulk insert
i przez wkładkęselect statement
. dziękuję za twoją sugestięUżywa najlepszego i najbardziej pewnego rozwiązania
SCOPE_IDENTITY()
.Trzeba tylko uzyskać tożsamość zasięgu po każdej wstawce i zapisać ją w zmiennej, ponieważ można wywołać dwie wstawki w tym samym zakresie.
ident_current
i@@identity
być może działają, ale nie są bezpiecznym zakresem. Możesz mieć problemy w dużej aplikacjiWięcej szczegółów znajduje się tutaj Dokumenty Microsoft
źródło
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
klauzula jest lepszym, czystszym rozwiązaniem :)Możesz użyć,
scope_identity()
aby wybrać identyfikator wiersza, który właśnie wstawiłeś do zmiennej, a następnie wybierz dowolne kolumny z tabeli, w której id = tożsamość, którą otrzymałeśscope_identity()
Zobacz tutaj informacje MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
źródło
Istnieje wiele sposobów uzyskania ostatniego wstawionego identyfikatora po poleceniu wstawiania.
@@IDENTITY
: Zwraca ostatnią wartość tożsamości wygenerowaną dla połączenia w bieżącej sesji, niezależnie od tabeli i zakresu instrukcji, która wygenerowała tę wartośćSCOPE_IDENTITY()
: Zwraca ostatnią wartość tożsamości wygenerowaną przez instrukcję insert w bieżącym zakresie w bieżącym połączeniu, niezależnie od tabeli.IDENT_CURRENT(‘TABLENAME’)
: Zwraca ostatnią wartość tożsamości wygenerowaną w określonej tabeli, niezależnie od Dowolnego połączenia, sesji lub zakresu. IDENT_CURRENT nie jest ograniczony zakresem i sesją; jest ograniczony do określonej tabeli.Teraz trudniej jest zdecydować, który z nich będzie dokładnie pasował do moich wymagań.
Najbardziej preferuję SCOPE_IDENTITY ().
Jeśli użyjesz select SCOPE_IDENTITY () wraz z TableName w instrukcji insert, otrzymasz dokładny wynik zgodnie z twoimi oczekiwaniami.
Źródło: CodoBee
źródło
Oto jak używam OUTPUT INSERTED podczas wstawiania do tabeli, która używa ID jako kolumny tożsamości w SQL Server:
źródło
Możesz dołączyć instrukcję select do instrukcji insert. Liczba całkowita myInt = Wstaw do wartości table1 (FName) („Fred”); Wybierz Scope_Identity (); Zwróci to wartość tożsamości podczas wykonywania skalera.
źródło
Po wykonaniu wstawienia do tabeli z kolumną tożsamości możesz odwołać się do @@ TOŻSAMOŚĆ, aby uzyskać wartość: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
źródło
* Kolejność parametrów w ciągu połączenia jest czasem ważna. * Lokalizacja parametru dostawcy może złamać kursor zestawu rekordów po dodaniu wiersza. Widzieliśmy to zachowanie u dostawcy SQLOLEDB.
Po dodaniu wiersza pola wiersza nie są dostępne, chyba że dostawca jest określony jako pierwszy parametr w ciągu połączenia. Gdy dostawca jest gdziekolwiek w ciągu połączenia, z wyjątkiem pierwszego parametru, nowo wstawione pola wiersza są niedostępne. Kiedy przenieśliśmy Dostawcę do pierwszego parametru, pola wierszy magicznie się pojawiły.
źródło