43

次のように定義されているテーブルに新しい行の束を挿入しています。

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つの方法は、現在最大のIDをsometableから取得し、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()

より良いパターンはありますか?

4

5 に答える 5

106

OUTPUT機能を使用して、すべてのINSERTEDIDをテーブルに戻します。

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
于 2009-05-01T10:55:26.637 に答える
1

また、ADO.Net で「コントロール」が必要な場合は、子に割り当てられた ID を取得し、モデルを更新できるように ID を取得します: http://daniel.wertheim.se/2010/10/24/c-バッチ ID 挿入/

于 2010-10-24T18:16:21.270 に答える
0

この保存された手順を使用する

これは動的な主キーになります。


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

于 2009-05-01T11:19:43.020 に答える
0

すべての新しい ID を設定するテーブルを作成します。次に、すべての挿入のループを作成します。ループ内で、SCOPE_IDENTITY() を使用して必要な挿入を行います。挿入後、新しい ID を取得し、作成した新しいテーブルに挿入します。最後に [newTable] から * を選択します。

于 2009-05-01T17:03:11.480 に答える