2010-10-13 1 views
5

Можно ли получить новые значения для Id (IDENTITY) перед вставкой данных в таблицу?Можно ли получить новые значения для идентификатора (IDENTITY), прежде чем вставлять данные в таблицу?

Is можно написать что-то вроде этого:

INSERT INTO Table1 
SELECT *GET_NEW_IDENTITY*, Field1, Field2 FROM Table2 

мне нужно значение Id, потому что я хочу, чтобы вставить данные в табл.1 и, только после вставки данных в другой таблице, которая имеет внешний ключ связанный с таблицей 1 (с идентификатором)

ответ

6

IDENT_CURRENT. Возвращает последнее значение идентификации, сгенерированное для указанной таблицы или представления. Последнее генерируемое значение идентичности может быть для любого сеанса и любой области видимости.

SCOPE_IDENTITY. Возвращает последнее значение идентичности, вставленное в столбец идентификатора в той же области. Объем - это модуль: хранимая процедура, триггер, функция или партия.

OUTPUT. Возвращает информацию или выражения на основе каждой строки, затрагиваемой оператором INSERT, UPDATE, DELETE или MERGE. [...] Предложение OUTPUT может быть полезно для получения значения идентификационных или вычисленных столбцов после операции INSERT или UPDATE.

+2

Никогда ни при каких обстоятельствах не используйте ident_current для этого, он НЕ вернет правильный результат, если у вас есть несколько пользователей! Результат - лучший выбор или scope_identity(), если ваша версия не поддерживает предложение вывода. – HLGEM

0

Нет, поскольку это действие добавления строки, которая создает новое значение идентификации.

Чтобы сделать то, что вы хотите,

SELECT newid = @@identity FROM table 

только после INSERT

+0

@@ идентичность очень опасно использовать и не будет достоверно возвращать правильные результаты. Вы не используете его для этой цели. – HLGEM

0

Зачем вам нужно, чтобы получить значение идентификатора, прежде чем делать вставку? Просто вставьте в таблицу2 значение SCOPE_IDENTITY() и затем используйте полученное значение Id для вашей вставки в Таблице 1.

+0

Потому что я хочу сделать пакетную вставку (не вставлять строки за строкой) для perf –

+1

В таком случае нет, вы не можете этого сделать. Вы должны получить личность после каждой вставки строки, как указал @smirkingman в своем ответе. –

+0

@ AJ: Хорошо, спасибо –

2

Вы также можете иметь оператор вставки, который возвращает вновь вставленное значение для последующего использования. например

create table demo(Id int identity primary key, data varchar(10)) 
go 
insert into demo(data) output inserted.Id values('something') 
0

Это просто быстрая демонстрация. Вы можете использовать новый идентификатор для вставки для обновления, вставить в другую таблицу, запрос и т. Д. По-другому. Надеясь я не вставить ошибки в сценарии во время форматирования, редактирования после

-- run [1] before this script once to have environment 

--create temporary table once if not dropped after 
-- really only ID field is needed, the others are for illustration 
create table #temp_id (Id int, d1 int, d2 int) 

select * from Table2;-- this is read-only, filled once here source 
select * from Table1;--interesting for following runs 

insert into Table1 
    OUTPUT INSERTED.id 
    -- really only ID is needed, the rest is for illustration 
    , inserted.d1, inserted.d2 INTO #temp_id 
select field1, field2, null-- null to be merged later 
-- or inserted/updated into another table 
    from Table2; 

select * from Table1; 
select * from #temp_id; 


MERGE Table1 AS TARGET 
    USING #temp_id AS SOURCE 
     ON (TARGET.id = SOURCE.id) 
    WHEN MATCHED 
--AND OR are redundant if Table1.ID is PK  
    THEN 
    UPDATE SET TARGET.IDnew = SOURCE.id; 


select * from Table1; 


--drop table #temp_id 
--drop table table1 
--drop table table2 

[1]
воспроизводящих таблицы из вопроса и заполнение данных

create table Table1(Id int identity primary key, d1 int, d2 int, IDnew int) 
create table Table2(field1 int, field2 int) 
insert into table2 values(111,222) 
insert into table2 values(333,444) 

 Смежные вопросы

  • Нет связанных вопросов^_^