2016-08-24 1 views
0

Je réalise une insertion en bloc sur une table dans sql server 2012, en même temps, je sélectionne la dernière ligne insérée avec la fonction max() et l'insère dans une autre table , comment effectuer ceci quand ma table reçoit des données de plusieurs sources parce que pendant l'insertion dans la table secondaire il y a un délai pendant que des insertions se produisent encore dans la table primaire la prochaine fois que max() ramassera la dernière rangée mise à jour les lignes qui ne sont pas max() mais qui sont quand même insérées dans la table primaire.Gestion de l'insertion en bloc sur une table avec plusieurs sources d'entrée dans 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 

Répondre

0

Utilisez la sortie ... l'article

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 

Ou utiliser un déclencheur

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

sortie clause doesnt permettent des références clés étrangères, dans mes tables de cas sont create table dbo.emp ( id int identité de clé primaire (1,1), emp_id int, nom varchar (255), adresse varchar (255) ) create table dbo.empx ( id int clé primaire, emp_id int références clés étrangères dbo.emp (id), ) –

+0

Ensuite, essayez avec un déclencheur .. vérifier le code mis à jour .. –

+0

Ma première pensée était d'utiliser un trigger mais le trigger sera invoqué sur chaque insert (considérez les insertions 4lac) n'est ce pas qu'une requête insert sera beaucoup plus légère qu'appeler un trigger. –