2016-08-24 5 views
0

SQL Server 2012のテーブルに一括挿入を実行しているときに、同時にmax()関数を使用して最後に挿入した行を選択して別のテーブルに挿入しています私のテーブルが複数のソースからデータを取得しているときにどのように実行するかは、セカンダリテーブルへの挿入を実行中に、プライマリテーブルで挿入がまだ発生しているので、次回max()が最後に更新されたローをピックアップし、その間にmax()ではなくプライマリ・テーブルにまだ挿入されている行。SQLで複数の入力ソースを持つテーブルに一括挿入を処理する

create table dbo.emp 
(
id int primary key identity(1,1), 
emp_id int, 
name varchar(255), 
address varchar(255) 
) 

create table dbo.empx 
(
id int primary key, 
emp_id int foreign key references dbo.emp(id), 
) 


    declare @temp int ; 
     set @temp=1; 
     while @temp<1000 
     begin 
     insert into dbo.emp(emp_id,name,address)values ([email protected],'Ename'+LTRIM(STR(@temp)),'123 Sample Address'+LTRIM(STR(@temp))); 
     set @[email protected]+1; 

     insert into dbo.empx select max(dbo.emp.id),max(dbo.emp.emp_id) from dbo.emp 

     end 

答えて

0

使用OUTPUT句...

CREATE TABLE #empx 
(Id INT ,emp_id VARCHAR(50)) 

DECLARE @temp INT ; 
SET @temp=1; 
    WHILE @temp<1000 
    BEGIN 
     INSERT INTO dbo.emp(emp_id,name,address) 
      OUTPUT INSERTED.Id,INSERTED.emp_id INTO #empx(Id,emp_id) 
     VALUES ([email protected],'Ename'+LTRIM(STR(@temp)),'123 Sample Address'+LTRIM(STR(@temp))); 

     SET @[email protected]+1; 

    END 
INSERT INTO dbo.empx(Id,emp_id) 
SELECT Id,emp_id FROM #empx 

それとも

CREATE TRIGGER EmpLog 
    ON dbo.emp 
    AFTER Insert 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Insert into dbo.empx (id,emp_id) Select id,emp_id from inserted; 
END 
GO 
+0

出力句dosen'tは、外部キー参照を許可するトリガを使用し、私の場合テーブルにテーブルdbo.empを作成しています ( id int主キーID(1,1)、 emp_id int、 名前varchar(255)、 アドレスvarchar(255)その後) テーブルdbo.empx 作成( ID int型主キーを、 EMP_ID int型の外部キー参照が(IDをdbo.emp)、 ) –

+0

私の更新されたコードを確認してください。..トリガーとしてみてください。.. –

+0

私が最初に考えましたトリガを使用することでしたが、トリガは各インサートで呼び出されます(4lacの挿入を考慮してください)。インサートクエリがトリガを呼び出すよりもはるかに軽くなるわけではありません。 –

関連する問題