Sql server sql server:在同一时刻在两个表中插入多条记录
我有两个表employee和employeeDetails,两个表之间的关系是一对一,我希望在employee表上插入所有记录后获得所有Id并将其插入employeeDetails表 我从xml中选择查询并将其插入employee表Sql server sql server:在同一时刻在两个表中插入多条记录,sql-server,database,sql-server-2005,Sql Server,Database,Sql Server 2005,我有两个表employee和employeeDetails,两个表之间的关系是一对一,我希望在employee表上插入所有记录后获得所有Id并将其插入employeeDetails表 我从xml中选择查询并将其插入employee表 my query: INSERT INTO employee SELECT ID,Name, Salary FROM OPENXML(@hDoc, 'employees/employee') // file contains 50000 record WITH (
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',
)
但我不想使用触发器您可以使用SCOPE\u IDENTITY从员工到员工选择数据1
在事务中使用任何类型的临时表,下面我将在SQL Server中使用一个表变量,但您也可以简单地创建一个临时表。将50000多行放入@TEMP_EMPLOYEE表中,这样它们就不会与现有数据混合,然后只需将@TEMP_EMPLOYEE表中的行插入EMPLOYEE和EMPLOYEE1表中即可 这个答案是针对您的原始问题的,没有提到标识列或外键
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表具有标识列ID,并且EMPLOYEE1表具有指向第一个EMPLOYEE表的ID列上的外键CONSTRAINT),那么您可以使用游标和作用域标识执行以下操作
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_不相信Emloye1中员工的更多细节如果其中一个表是另一个表的扩展,则使用外键。不要复制数据。@DotNetDeveloper是的,我希望执行此解决方案,但员工id是身份和一对一的关系。请解释为什么您认为应该更改答案,并让发布答案的人更新答案,除非是次要编辑。因为员工id是身份,我无法将其插入临时员工表,我希望插入记录雇员和获得插入ids@user3152935请将表格定义添加到问题中。若列ID为的employee表是一个标识,那个么在您的问题中,您将插入到该列ID中,这是不正确和误导的。您的问题标识栏中也没有任何内容。我的回答仅适用于您的原始问题,没有提及标识或外键。因此,如果一个表与另一个表之间有外键,哪些表或两个表都有标识,而您在问题中没有提到,那么这些都是非常关键的信息。然后我可以回答。这是5000条记录的批量插入,我不能使用SCOPE\u标识
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