使用任何类型的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
为什么有两个表,如果第二台只是从第一复制数据?这个设计背后的动机是什么? –
@Damien_The_Unbeliever有关员工在emloyee1中的更多详细信息 –
如果其中一个表是其他表的扩展名,则使用外键。不要复制数据。 – DotNetDeveloper