2016-08-24 43 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

輸出條款這麼想的允許外鍵引用,在我的情況下表是創建表dbo.emp ( id int主鍵標識(1,1), emp_id int, name varchar(255), address varchar(255) ) 創建表dbo.empx ( ID INT主鍵, EMP_ID INT外鍵引用dbo.emp(ID), ) –

+0

然後用觸發嘗試..檢查我的更新代碼.. –

+0

我首先想到的是使用觸發器,但每次插入時都會調用觸發器(考慮4lac插入)是不是插入查詢比調用觸發器要輕得多。 –