Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql server:在同一时刻在两个表中插入多条记录_Sql Server_Database_Sql Server 2005 - Fatal编程技术网

Sql server sql server:在同一时刻在两个表中插入多条记录

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 (

我有两个表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 
(
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