2012-11-19 10 views
15

Mam google ten problem jeden tydzień i nie ma nic użytecznego myślę ja nie stosując odpowiednie słowoJak uzyskać wartość autoIncrement w ostatnim rzędzie na wkładce

używam programu SQL Server 2008 z T-SQL oraz moim zadaniem jest zoptymalizować moją funkcję, gdy wstawiam nowy wiersz.

Mam tabeli z pierwszej kolumnie jest kluczem typu całkowitą autoIncrement i innych kolumn są tylko dla informacji

Kiedy robimy wkładkę, zwiększa SQL Server klucz automatycznie i muszę zrobić select max do uzyskać wartość, więc czy jest jakiś sposób jak zmienna globalna jak @@IDENTITY lub funkcji, aby uniknąć rozpocząć transakcję końcową i wybrać max

Odpowiedz

29

Korzystając SCOPE_IDENTITY:

-- do insert 

SELECT SCOPE_IDENTITY(); 

który daje:

Ostatnia wartość tożsamości wstawiona do kolumny tożsamości w w tym samym zakresie. Zakres to moduł: procedura składowana, wyzwalacz, funkcja lub partia. Dlatego dwie instrukcje są w tym samym zakresie, jeśli są w tej samej procedurze, funkcji lub partii.

-1
SELECT IDENT_CURRENT(‘tablename’) 

Zwraca ostatnią wartość tożsamości przedstawiony w tabeli, niezależnie od związku, który stworzył wartość, a niezależnie od zakresu rachunku, które produkowały wartość. IDENT_CURRENT nie jest ograniczony zasięgiem i sesją; ogranicza się do określonej tabeli. IDENT_CURRENT zwraca wartość tożsamości wygenerowaną dla określonej tabeli w dowolnej sesji i dowolnym zakresie.

albumu: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

albo to:

INSERT INTO Persons (FirstName) VALUES ('Joe'); 
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity; 

albumu: http://network.convergenceservices.in/forum/22-ms-sql/384-get-last-inserted-record-id-in-ms-sql.html

+0

Jedynym problemem z "SCOPE_IDENTITY" jest to, że zwraca ostatnią wartość identyfikatora utworzoną w dowolnej tabeli. IMO zawsze będziesz znać nazwę tabeli, w której wstawiłeś lub zmanipulowałeś danymi i będziesz chciał tylko wycofać dane z tego stołu - pas i szelki. – Paul

+0

Z linku, do którego się odwołujesz: "zawsze używaj SCOPE_IDENTITY()". Bardziej prawdopodobne jest, że chcesz znać identyfikator wpisu, który wstawiłeś, a nie ostatni rekord. – podiluska

2

co o tym przez ostatni auto wartości przyrostu

SELECT IDENT_CURRENT ('nazwa_tabeli') -IDENT_INCR ('table_name')

4

Wystarczy prowadził kod:

INSERT INTO Persons (FirstName) VALUES ('Joe'); 
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity; 

a także działa!

+2

Co się dzieje, jeśli z innego wątku należy wprowadzić inne wstawienie między tymi dwoma zapytaniami? – user2983041

0

Jeśli używasz MySQL uzyskać identyfikator automatycznego przyrostu ostatniego z wkładką:

SELECT LAST_INSERT_ID();

Zobacz here dla pełnego odniesienia.

0

W moim przypadku musiałem użyć identyfikatora @@, ponieważ wstawiałem do widoku. Wygląda na to, że SCOPE_IDENTITY działa tylko dla tych, które jawnie utworzyłeś.

Zobacz tutaj:

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

@@ IDENTITY zwróci ostatnią wartość tożsamości wprowadzony do tabeli w bieżącej sesji. Chociaż @@ TOŻSAMOŚĆ jest ograniczona do bieżącej sesji , nie jest ograniczona do bieżącego zakresu. Jeśli masz wyzwalacz w tabeli, która powoduje, że tożsamość zostanie utworzona w innej tabeli, otrzymasz tożsamość, która została utworzona jako ostatnia, nawet jeśli był to wywoływacz , który ją utworzył.