Получение новых идентификаторов после вставки
-
03-07-2019 - |
Вопрос
Я вставляю кучу новых строк в таблицу, которая определяется следующим образом:
CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
используя следующую вставку:
insert into sometable select somefield as someval from othertable
когда я закончу, я хотел бы знать идентификаторы всех вновь вставленных строк.SCOPE_IDENTITY() возвращает только идентификатор последней вставленной строки.
Как я могу получить все новые идентификаторы?
Одним из методов, который приходит на ум, было бы захватить текущий наибольший идентификатор из sometable и scope_identity() после вставки и использовать эти два значения для выбора из sometable.Например:
declare @currentMaxId int;
select @currentMaxId=MAX(id) from sometable
insert into sometable select somefield as someval from othertable
select * from sometable where id>@currentMaxId and id<=SCOPE_IDENTITY()
Есть ли лучший шаблон?
Решение
Используйте функцию ВЫВОДА, чтобы сохранить все ВСТАВЛЕННЫЕ идентификаторы обратно в таблицу.
CREATE TABLE MyTable
(
MyPK INT IDENTITY(1,1) NOT NULL,
MyColumn NVARCHAR(1000)
)
DECLARE @myNewPKTable TABLE (myNewPK INT)
INSERT INTO
MyTable
(
MyColumn
)
OUTPUT INSERTED.MyPK INTO @myNewPKTable
SELECT
sysobjects.name
FROM
sysobjects
SELECT * FROM @myNewPKTable
Другие советы
И если вы хотите "контроль" в ADO.Net и получите идентификаторы, назначенные дочерним элементам, и получите идентификаторы обратно, чтобы вы могли обновить свою модель:http://daniel.wertheim.se/2010/10/24/c-batch-identity-inserts/
Пользователь этой сохраненной закупки
это будет динамический первичный ключ..
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
СОЗДАТЬ ПРОЦЕДУРУ sp_BulkInsertCountry
(
@Переменная пути к файлу (1000)
)
КАК
НАЧАТЬ--ПРОЦЕДУРУ
--объявление переменной
объявить переменную @SQL varchar(500)
объявить @id int
объявить переменную @countryName(30)
--Создать временную таблицу для страны
СОЗДАТЬ ТАБЛИЦУ #tmpCountry
(
Переменная countryName(30),
)
---выполнение массовой вставки во временную таблицу
SET @SQL='МАССОВАЯ ВСТАВКА #tmpCountry из "' + @FilePath + "' С помощью (FIELDTERMINATOR =",",ROWTERMINATOR="
")'
EXEC(@sql)
ОБЪЯВИТЬ cursor_Country КУРСОРОМ ТОЛЬКО ДЛЯ ЧТЕНИЯ ДЛЯ
выберите [Название страны] из #tmpCountry
ОТКРЫТЬ cursor_Country
ВЫПОЛНИТЬ ВЫБОРКУ NEXT ИЗ cursor_Country В @countryName
ПОКА @@FETCH_STATUS=0
НАЧАТЬ
ВЫБЕРИТЕ @id=isnull (максимальное значение (Идентификатор страны), 0) в tblCountryMaster
УСТАНОВИТЕ @id=@id +1
ВСТАВИТЬ В tblCountryMaster значения (@Id, @countryName)
ДАЛЕЕ ИЗВЛЕЧЬ ИЗ cursor_Country В @countryName
ЗАВЕРШЕНИЕ
ЗАКРЫТЬ cursor_Country
ОСВОБОДИТЬ cursor_Country
ЗАВЕРШЕНИЕ ПРОЦЕДУРЫ
ПЕРЕЙТИ
ОТКЛЮЧИТЕ QUOTED_IDENTIFIER
ПЕРЕЙТИ
ВКЛЮЧИТЕ ANSI_NULLS
ПЕРЕЙТИ
Для получения более подробной информации перейдите по следующей ссылке http://jalpesh.blogspot.com/search ?q=объем+вставка
создайте таблицу для установки всех новых идентификаторов.затем сделайте петлю для всех вставок.внутри цикла сделайте нужную вставку с помощью SCOPE_IDENTITY().после вставки получите новый идентификатор и вставьте его в новую таблицу, для которой вы создали.в конце выберите * из [Новой таблицы].