次のように定義されたテーブルに一連の新しい行を挿入しています。
_CREATE TABLE [sometable](
[id] [int] IDENTITY(1,1) NOT NULL,
[someval] sometype NOT NULL
)
_
次の挿入を使用します。
_insert into sometable select somefield as someval from othertable
_
完了したら、新しく挿入されたすべての行のIDを知りたいのですが。 SCOPE_IDENTITY()
は、最後に挿入された行のIDのみを返します。
新しいIDをすべて取得するにはどうすればよいですか?
頭に浮かぶ方法の1つは、sometableから現在の最大のIDを取得し、scope_identity()ポスト挿入を取得して、これらの2つの値を使用して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()
_
より良いパターンはありますか?
OUTPUT機能を使用して、すべてのINSERTED Idをテーブルに戻します。
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の「コントロール」が必要で、子に割り当てられたIDを取得し、IDを取得して、モデルを更新できるようにした場合 http://daniel.wertheim.se/2010/10/ 24/c-batch-identity-inserts /
このストアドプロシージャのユーザー
これは動的な主キーになります。
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_BulkInsertCountry
(
@FilePath varchar(1000)
)
AS
BEGIN--PROCEDURE
--variable declaration
declare @SQL varchar(500)
declare @id int
declare @CountryName varchar(30)
--Create temporary table for Country
CREATE TABLE #tmpCountry
(
CountryName varchar(30),
)
---executing bulk insert on temporary table
SET @SQL='BULK INSERT #tmpCountry from ''' + @FilePath + ''' WITH (FIELDTERMINATOR ='','',ROWTERMINATOR=''\n'')'
EXEC(@sql)
DECLARE cursor_Country CURSOR READ_ONLY FOR
select [CountryName] from #tmpCountry
OPEN cursor_Country
FETCH NEXT FROM cursor_Country INTO @CountryName
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @id=isnull(max(Countryid),0) from tblCountryMaster
SET @id=@id+1
INSERT INTO tblCountryMaster values(@Id,@CountryName)
FETCH NEXT FROM cursor_Country INTO @CountryName
END
CLOSE cursor_Country
DEALLOCATE cursor_Country
END--PROCEDURE
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
詳細については、次のリンクにアクセスしてください http://jalpesh.blogspot.com/search?q=bulk+insert
すべての新しいIDを設定するテーブルを作成します。次に、すべての挿入に対してループを作成します。ループ内では、SCOPE_IDENTITY()を使用して必要な挿入を行います。挿入後、新しいIDを取得して、作成した新しいテーブルに挿入します。最後に[* from [newTable]]を選択します。