2014-01-29 55 views
-2

我有两个表employee和employeeDetails,两个表之间的关系是一对一的,我希望在employee表上插入所有记录后获取所有Id并将其插入employeeDetails表。sql server:在同一时刻在两个表中插入多条记录

我已经询问从XML选择和插入表的员工

my query: 
INSERT INTO employee 
SELECT ID,Name, Salary 
FROM OPENXML(@hDoc, 'employees/employee') // file contains 50000 record 
WITH 
(
ID int 'ID', 
Name [varchar](50) 'Name', 
Salary money 'Salary', 
) 

,但我不想使用触发器

+1

为什么有两个表,如果第二台只是从第一复制数据?这个设计背后的动机是什么? –

+0

@Damien_The_Unbeliever有关员工在emloyee1中的更多详细信息 –

+0

如果其中一个表是其他表的扩展名,则使用外键。不要复制数据。 – DotNetDeveloper

回答

-1
declare @Temp table(
    id int 
    ) 

INSERT INTO employee OUTPUT INSERTED.id INTO @Temp 
SELECT ID,Name, Salary 
FROM OPENXML(@hDoc, 'employees/employee') // file contains 50000 record 
WITH 
(
ID int 'ID', 
Name [varchar](50) 'Name', 
Salary money 'Salary', 
) 

insert into employeeDetails 
    select * from @Temp 
1

使用任何类型的TEMP表的事务中,下面我使用SQL Server表变量,但你可以简单地创建一个#TEMP表也。将您的50000多行放入@TEMP_EMPLOYEE表中,以便它们不与现有数据混合,然后只需将@TEMP_EMPLOYEE表中的行插入到EMPLOYEE和EMPLOYEE1表中。

此答案适用于您的原始问题,但不提及IDENTITY列或FOREIGN KEYS。

BEGIN TRANSACTION 
    DECLARE @TEMP_EMPLOYEE TABLE 
    (
    Id INT, 
    Name VARCHAR(50), 
    Salary MONEY 
    ) 

    INSERT INTO @TEMP_EMPLOYEE 
    SELECT ID,Name, Salary 
     FROM OPENXML(@hDoc, 'employees/employee') -- file contains 50000 record 
    WITH 
    (
     Id INT 'ID', 
     Name [varchar](50) 'Name', 
     Salary money 'Salary' 
    ) 

    INSERT INTO employee SELECT Id, Name, Salary FROM @TEMP_EMPLOYEE 
    INSERT INTO employee1 SELECT Id, Name, Salary FROM @TEMP_EMPLOYEE 

COMMIT TRANSACTION 

但是,如果,如果我正确地理解您的意见,如果EMPLOYEE表具有IDENTITY列ID和EMPLOYEE1表有外键CONSTRAINST的ID列第一EMPLOYEE表,那么你可以做以下使用CURSOR和SCOPE_IDENTITY。

BEGIN TRANSACTION 
    DECLARE @TEMP_EMPLOYEE TABLE 
    (
    Id INT, 
    Name VARCHAR(50), 
    Salary MONEY 
    ) 

    INSERT INTO @TEMP_EMPLOYEE 
    SELECT ID,Name, Salary 
     FROM OPENXML(@hDoc, 'employees/employee') -- file contains 50000 record 
    WITH 
    (
     Id INT 'ID', 
     Name [varchar](50) 'Name', 
     Salary money 'Salary' 
    ) 

    DECLARE @CURSOR_ID INT 
    DECLARE @CURSOR_NAME VARCHAR(50) 
    DECLARE @CURSOR_SALARY MONEY 
    DECLARE @IDENT_ID INT 

    DECLARE EmployeeCursor CURSOR FOR SELECT [Id], [Name], [Salary] FROM @TEMP_EMPLOYEE 
    OPEN EmployeeCursor 
    FETCH NEXT FROM EmployeeCursor INTO @CURSOR_ID,@CURSOR_NAME, @CURSOR_SALARY 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- Table with the Identity Column 
     INSERT INTO Employee(Name, Salary) VALUES(@CURSOR_NAME, @CURSOR_SALARY) 
     SELECT @IDENT_ID = SCOPE_IDENTITY() 
     --Table with the Foreign Key Column 
     INSERT INTO Employee1(Id, Name, Salary) VALUES(@IDENT_ID, @CURSOR_NAME,  @CURSOR_SALARY) 
     FETCH NEXT FROM EmployeeCursor INTO @CURSOR_ID,@CURSOR_NAME, @CURSOR_SALARY 
    END 
    CLOSE EmployeeCursor 
    DEALLOCATE EmployeeCursor 

COMMIT TRANSACTION 
+0

但员工ID是IDENTITY和一对一关系 –

+0

请解释为什么你认为答案应该改变,让发布它的人更新它(除非是小编辑)。 –

+0

forein keys .... – DotNetDeveloper

相关问题