在事务中使用任何类型的 TEMP 表,下面我在 SQL Server 中使用 TABLE VARIABLE,但您也可以简单地创建一个#TEMP 表。将 50000 多行放入 @TEMP_EMPLOYEE 表中,以免它们与现有数据混合,然后只需将 @TEMP_EMPLOYEE 表中的行插入 EMPLOYEE 和 EMPLOYEE1 表中。
此答案针对您的原始问题,未提及 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'
)
INSERT INTO employee SELECT Id, Name, Salary FROM @TEMP_EMPLOYEE
INSERT INTO employee1 SELECT Id, Name, Salary FROM @TEMP_EMPLOYEE
COMMIT TRANSACTION
但是,如果我正确理解您的 cmets,如果 EMPLOYEE 表具有 IDENTITY 列 ID,并且 EMPLOYEE1 表在第一个 EMPLOYEE 表的 ID 列上具有 FOREIGN KEY CONSTRAINST,那么您可以使用 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