2013-05-08 4 views
9

В моей базе данных все таблицы используют общую таблицу для Sequence (ID_Table).MS SQL Server Последнее вставленное ID

TABLE_ID имеет два поля (Common_ID, Table_Name).

Если я вставляю какую-либо запись в таблицу, я должен сначала вставить запись в Table_ID (Auto-increment, Table_name), а затем использовать значение Auto-increment в моей другой таблице.

Например, я хочу, чтобы вставить в Table_Products, которая имеет поля ID (Common_ID), PRODUCT_NAME, PRODUCT_ID (Auto Increment)

Я хочу сделать что-то вроде этого:

INSERT INTO TABLE_ID (Table_NAME), Values (Table_Products) 

Получить вставленная ID и использовать его в Table_Products:

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

«В В моей базе данных все таблицы используют общую таблицу для Sequence (ID_Table). " - Зачем? –

+0

@ user2345661 - ваш TABLE_ID содержит идентификатор, который я должен использовать в следующей вставке в table_products? –

+0

Ну, это была база данных Firebird, созданная кем-то еще, которую я преобразовал в SQL-сервер. – user2345661

ответ

27

Попробуйте один -

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

Я думаю, что кто-то играет здесь. Кто-то тоже подал заявку на меня. :( – Maximus

+1

Согласитесь с @Sivakumar Почему 0-го ответа? – Devart

3

используйте SCOPE_IDENTITY() после ур вставки statementto получить последний вставленный идентификатор.

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

Что случилось с моим ответом. Почему вниз вниз? – Maximus

+0

Несколько синтаксических ошибок ('Table_NAME), Значения'), необъявленные переменные (' @ Product_Id') и указание столбца идентификации ('Product_ID') в списке значений вставки – Andomar

+0

@Andomar: он не собирается разворачивать этот код на производственный сервер.Я просто даю ему ответ, а не сценарий для развертывания. – Maximus

5

Вы можете использовать insert заявление с предложением output для создания нового Common_ID. Использование insert ... select, вы можете указать, что идентификатор операции вставки:

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

Вы могли бы быть также больше таблицы конкретных используя 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

Использование идентификатора IDENT_CURRENT для получения введенного вами идентификатора приводит к состоянию гонки. – Andomar

+0

Большинство ответов использует SCOPE_IDENTITY(), поэтому я просто даю ему альтернативное решение, поэтому я использовал IDENT_CURRENT для этого. Не имеет ли SCOPE_IDENTITY() практически тот же сценарий, хотя и в более универсальном контексте, а не в таблице? И как насчет вывода? Это очень специфично для таблицы, не приводит ли к тому же состояние гонки? Что делать, если вы получите @Common_ID кто-то вставил миллисекунду после этого? Итак, это был бы не последний идентификатор? – Edper

+3

'scope_identity()' возвращает последний идентификатор, сгенерированный вашим сеансом. И 'output' захватывает строку, вставленную в ваш оператор insert. влиять на другие одновременные сеансы, но 'ident_current()' страдает от условий гонки, а 'identity()' (без 'scope_') может быть перезаписан из триггер. – Andomar

2

Дорогой друг, вы должны выбрать идентификатор последней записи, вставленной , а затем передать его в другой таблице так ниже код поможет вам очень хорошо

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) 

этот код будет решить вашу проблему я определить @Id для Ваш последний идентификатор записи, а затем вставить его в другой таблице

1

Для MySql использовать select LAST_INSERT_ID();

+1

вопрос для SQL Server –

0

Все другие ответы до сих пор объявить промежуточные переменные для SCOPE_IDENTITY(), но это может быть проще:

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

INSERT INTO dbo.Table_Products (ID, Product_Name) VALUES (SCOPE_IDENTITY(),'SomeProduct');