SQL Server:是否可以同时插入两个表?

我的数据库包含三个名为Object_TableData_TableLink_Table 。 链接表只包含两列,即对象logging的标识和数据logging的标识。

我想复制从DATA_TABLE链接到一个给定的对象标识的数据,并将相应的logging插入到Data_TableLink_Table以获得不同的给定对象标识。

可以通过select一个表variables和通过为每个迭代做两个插入循环来做到这一点。

这是做这件事的最好方法吗?

编辑 :我想避免一个循环,有两个原因,第一个是我很懒,循环/临时表需要更多的代码,更多的代码意味着更多的地方犯错误,第二个原因是关注性能。

我可以复制一个插入的所有数据,但如何获得链接表链接到新的数据logging,每个logging有一个新的ID?

在一个声明中 :不。

在一个交易中 :是的

 BEGIN TRANSACTION DECLARE @DataID int; INSERT INTO DataTable (Column1 ...) VALUES (....); SELECT @DataID = scope_identity(); INSERT INTO LinkTable VALUES (@ObjectID, @DataID); COMMIT 

好消息是,上面的代码也保证是primefaces的 ,可以从一个客户端应用程序发送到一个SQLstring在一个单一的函数调用,就像它是一个语句的服务器。 您也可以将触发器应用于一个表以获得单个插入的效果。 然而,它最终还是两个语句,你可能不想为每个插入运行触发器。

您仍然需要两个INSERT语句,但听起来您想要从第一个插入中获取IDENTITY并在第二个插入中使用它,在这种情况下,您可能需要查看OUTPUTOUTPUT INTO : http : //msdn.microsoft .COM / EN-US /库/ ms177564.aspx

下面使用表格variables设置我的情况。

 DECLARE @Object_Table TABLE ( Id INT NOT NULL PRIMARY KEY ) DECLARE @Link_Table TABLE ( ObjectId INT NOT NULL, DataId INT NOT NULL ) DECLARE @Data_Table TABLE ( Id INT NOT NULL Identity(1,1), Data VARCHAR(50) NOT NULL ) -- create two objects '1' and '2' INSERT INTO @Object_Table (Id) VALUES (1) INSERT INTO @Object_Table (Id) VALUES (2) -- create some data INSERT INTO @Data_Table (Data) VALUES ('Data One') INSERT INTO @Data_Table (Data) VALUES ('Data Two') -- link all data to first object INSERT INTO @Link_Table (ObjectId, DataId) SELECT Objects.Id, Data.Id FROM @Object_Table AS Objects, @Data_Table AS Data WHERE Objects.Id = 1 

感谢另一个答案 ,指出我对OUTPUT条款我可以演示一个解决scheme:

 -- now I want to copy the data from from object 1 to object 2 without looping INSERT INTO @Data_Table (Data) OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId) SELECT Data.Data FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id WHERE Objects.Id = 1 

然而事实certificate,由于以下的错误,在现实生活中并不那么简单

OUTPUT INTO子句不能位于(主键,外键)关系的任一侧

我仍然可以OUTPUT INTO一个临时表,然后用正常的插入完成。 所以我可以避免我的循环,但我不能避免临时表。

如果你想要的行动或多或less是primefaces,我会确保把它们包装在一个交易。 这样你就可以确定两者都发生了,或者两者都没有按需要发生。

这听起来像链接表捕捉对象表和数据表之间的许多关系。

我的build议是使用存储过程来pipe理交易。 当你想插入到对象或数据表中执行插入时,获取新的ID并将它们插入到链接表中。

这允许你的所有逻辑保持封装在一个易于调用的sproc中。

您可以创build一个视图,select插入语句所需的列名,添加INSTEAD OF INSERT触发器,然后插入到此视图中。

插入一次只能在一张桌子上操作。 多个插入必须有多个语句。

我不知道你需要通过一个表variables循环 – 你不能只用一个质量块插入一个表,然后质量插入到另一个?

顺便说一句 – 我猜你的意思是从Object_Table复制数据; 否则这个问题没有意义。

在能够在Oracle中执行多项式插入之前,您可以使用涉及插入到视图中的技巧,该视图上定义了一个INSTEAD OF触发器来执行插入操作。 这可以在SQL Server中完成吗?

我想强调使用

 SET XACT_ABORT ON; 

用于多个sql语句的MSSQL事务。

请参阅: https : //msdn.microsoft.com/en-us/library/ms188792.aspx他们提供了一个很好的例子。

所以,最终的代码应该如下所示:

 SET XACT_ABORT ON; BEGIN TRANSACTION DECLARE @DataID int; INSERT INTO DataTable (Column1 ...) VALUES (....); SELECT @DataID = scope_identity(); INSERT INTO LinkTable VALUES (@ObjectID, @DataID); COMMIT 
 -- ================================================ -- Template generated from Template Explorer using: -- Create Procedure (New Menu).SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in -- the definition of the procedure. -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE InsetIntoTwoTable ( @name nvarchar(50), @Email nvarchar(50) ) AS BEGIN SET NOCOUNT ON; insert into dbo.info(name) values (@name) insert into dbo.login(Email) values (@Email) END GO 

//如果你想插入一样的第一个表

 $qry = "INSERT INTO table (one, two, three) VALUES('$one','$two','$three')"; $result = @mysql_query($qry); $qry2 = "INSERT INTO table2 (one,two, three) VVALUES('$one','$two','$three')"; $result = @mysql_query($qry2); 

//或者如果你想插入表格的某些部分

  $qry = "INSERT INTO table (one, two, three) VALUES('$one','$two','$three')"; $result = @mysql_query($qry); $qry2 = "INSERT INTO table2 (two) VALUES('$two')"; $result = @mysql_query($qry2); 

/ /我知道它看起来太好,是正确的,但它的工作原理,你可以不断添加查询只是改变

  "$qry"-number and number in @mysql_query($qry"") 

我有17个表已经工作。