Можно ли получить новые значения для Id (IDENTITY) перед вставкой данных в таблицу? - PullRequest
5 голосов
/ 13 октября 2010

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

Можно написать что-то подобное:

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

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

Ответы [ 6 ]

6 голосов
/ 13 октября 2010

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

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

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

2 голосов
/ 13 октября 2010

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

create table demo( Id int identity primary key, data varchar(10))
go
insert into demo(data) output inserted.Id values('something')
0 голосов
/ 23 июня 2019

IDENT_CURRENT ('tableName') возвращает текущее значение идентификатора для данной таблицы. Значение идентификатора, которое будет назначено при вставке, будет IDENT_CURRENT ('tableName') + IDENT_INCR ('tableName').

SELECT IDENT_CURRENT('tableName') + IDENT_INCR('tableName')
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)
0 голосов
/ 13 октября 2010

Зачем вам нужно получить значение идентификатора, прежде чем делать вставку?Просто вставьте в Table2, возвращая SCOPE_IDENTITY () , а затем используйте полученное значение Id для вставки в Table1.

0 голосов
/ 13 октября 2010

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

Чтобы выполнить то, что вы хотите,

SELECT newid = @@identity FROM table

сразу после ВСТАВКИ

...