2013-05-08 10 views
9

W mojej bazie danych wszystkie tabele używają wspólnej tabeli dla sekwencji (ID_Table).Ostatnio wstawiony identyfikator MS SQL Server

TABLE_ID ma dwa pola (Common_ID, Table_Name).

Jeśli wstawię dowolny rekord do tabeli, muszę najpierw wstawić rekord w Table_ID (Auto-inkrementacja, nazwa_tabeli), a następnie użyć tej wartości Auto-inkrementacji w mojej innej tabeli.

Na przykład, chcę wstawić w Table_Products który ma pola ID (Common_ID) PRODUCT_NAME, PRODUCT_ID (Auto przyrostu)

chcę zrobić coś takiego:

INSERT INTO TABLE_ID (Table_NAME), Values (Table_Products) 

uzyskać włożona ID i używać go w Table_Products:

INSERT INTO Table_Products (ID, Product_Name, Product_ID(Auto Increment) 
VALUES (ID from TABLE_ID, SomeProduct, Increment) 
+1

„W moja baza danych wszystkie tabele używają wspólnej tabeli dla Sequence (ID_Table). " - Czemu? –

+0

@ user2345661 - Twój identyfikator TABLE_ID zawiera identyfikator, który muszę użyć w następnym wstawieniu do table_products w prawo? –

+0

Cóż, to była baza danych Firebird utworzona przez kogoś innego, którą przekonwertowałem na serwer SQL. – user2345661

Odpowiedz

27

Spróbuj ten -

DECLARE @ID BIGINT 

INSERT INTO dbo.TABLE_ID (Table_NAME) 
SELECT 'Table_Products' 

SELECT @ID = SCOPE_IDENTITY() 

INSERT INTO dbo.Table_Products (ID, Product_Name) 
SELECT @ID, 'SomeProduct' 
+1

Myślę, że ktoś tu gra. Ktoś też mnie zajął. :( – Maximus

+1

Zgadzam się z @Sivakumar Dlaczego głosowanie w dół? – Devart

3

Używaj SCOPE_IDENTITY() po ur wkładką statementto dostać ostatni zapisany identyfikator.

DECLARE @Product_Id int 

INSERT INTO TABLE_ID (Table_NAME) VALUES (Table_Products); 
SELECT @Product_Id=SCOPE_IDENTITY(); 

Insert INTO Table_Products (ID, Product_Name) 
VALUES (ID from TABLE_ID, 'SomeProduct') 
+0

Co jest nie tak z moją odpowiedzią. Dlaczego spadł? – Maximus

+0

Kilka błędów składni ('Table_NAME), wartości '), niezadeklarowane zmienne (' @ Product_Id') i określenie kolumny tożsamości ('Product_ID') na liście wartości wstawiania – Andomar

+0

@Andomar: Nie będzie wdrażał tego kodu w serwer produkcyjny.Po prostu daję mu odpowiedź, a nie skrypt do wdrożenia. – Maximus

5

można użyć oświadczenie insert z klauzulą ​​output wygenerować nowy Common_ID. Korzystanie insert ... select, można określić, że identyfikator operacji insert:

declare @Common_ID as table(ID int) 

insert Table_ID 
     (Table_Name) 
output inserted.Common_ID into @Common_ID 
values ('Table_Products') 

insert Table_Products 
     (ID, Product_Name) 
select ID 
,  'Some Product' 
from @Common_ID 
-1

Możesz być także więcej stołowego specyficzne korzystając IDENT_CURRENT()

Insert INTO TABLE_ID (Table_NAME), Values (Table_Products) 

select @NewID=IDENT_CURRENT('TABLE_ID') 

Insert INTO Table_Products (ID, Product_Name, Product_ID 
Values (@NewID, SomeProduct, Increment) 
+3

Używanie 'IDENT_CURRENT' do pobrania wprowadzonej tożsamości wprowadza warunki wyścigu – Andomar

+0

Większość odpowiedzi używa SCOPE_IDENTITY(), więc podaję mu alternatywne rozwiązanie, więc użyłem IDENT_CURRENT SCOPE_IDENTITY() wirtualnie ma ten sam scenariusz, chociaż w bardziej uniwersalnym kontekście, a nie w zależności od tabeli? A co z wyjściem? To bardzo specyficzne dla tabeli, czy nie powoduje to również stanu wyścigu? Co jeśli po otrzymaniu @Common_ID ktoś wstawił milisekundę po tym? Więc nie byłby to ostatni identyfikator? – Edper

+3

'scope_identity()' zwraca ostatni identyfikator wygenerowany przez twoją sesję, a 'output' przechwytuje wiersz wstawiony przez twoją instrukcję insert. mieć wpływ na inne sesje symultaniczne, ale 'ident_current()' cierpi na warunki wyścigu, natomiast 'identity()' (bez 'scope_') może zostać nadpisane Spust. – Andomar

2

Drogi przyjacielu musisz wybrać identyfikator ostatniego rekordu wstawionego a następnie przekazać go w innej tabeli poniżej kod więc pomoże ci bardzo dobrze

Insert INTO TABLE_ID (Table_NAME), Values (Table_Products) 
DECLARE @ID int; 
set @ID = SCOPE_IDENTITY(); 

Insert INTO Table_Products (ID, Product_Name) 
Values (@ID, SomeProduct) 

ten kod rozwiąże problemu i określenie @ID dla Twoja ostatnia ID rekordu, a następnie włożyć go w innej tabeli

1

MySQL używać select LAST_INSERT_ID();

+1

pytanie dotyczy SQL Server –

0

Wszystkie inne odpowiedzi tak daleko deklarować zmiennych pośredniczących dla SCOPE_IDENTITY(), ale może to być prostsze:

INSERT INTO dbo.TABLE_ID (Table_NAME) VALUES 'Table_Products'; 

INSERT INTO dbo.Table_Products (ID, Product_Name) VALUES (SCOPE_IDENTITY(),'SomeProduct'); 
Powiązane problemy