Получение новых идентификаторов после вставки

StackOverflow https://stackoverflow.com/questions/810962

Вопрос

Я вставляю кучу новых строк в таблицу, которая определяется следующим образом:

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().после вставки получите новый идентификатор и вставьте его в новую таблицу, для которой вы создали.в конце выберите * из [Новой таблицы].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top