Sql 如何在没有光标的情况下进行多个插入

Sql 如何在没有光标的情况下进行多个插入,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有两张桌子 tblA( tableAID INT标识(1,1), 富瓦查尔(100)) tblB( 表投标文件的完整性(1,1), tableAID INT, 巴尔·瓦尔查尔(100)) tblB.tableAID是tblA的FK 我想在这对表中插入一组记录(从系统中的其他表中提取)。在插入tblB之前,我需要知道插入tblA的ID是什么 有没有办法不用逐行处理就可以做到这一点?可以使用临时表吗 DECLARE @t TABLE (foo, int, ba VARCHAR(50)) INS

假设我有两张桌子

tblA( tableAID INT标识(1,1), 富瓦查尔(100))

tblB( 表投标文件的完整性(1,1), tableAID INT, 巴尔·瓦尔查尔(100))

tblB.tableAID是tblA的FK

我想在这对表中插入一组记录(从系统中的其他表中提取)。在插入tblB之前,我需要知道插入tblA的ID是什么


有没有办法不用逐行处理就可以做到这一点?

可以使用临时表吗

DECLARE @t TABLE (foo, int, ba VARCHAR(50))
INSERT INTO @t (foo, bar) SELECT foo, bar FROM your_other_table
ALTER TABLE @t ADD id_a INT IDENTITY(1, 1)
您应该使用SET IDENTITY\u INSERT OFF来执行此操作

也许您希望在表处于生产状态时对表进行适当的插入

DBCC CHECKIDENT 'tblA' RESEED, newValue

假设您真正要问的是如何避免到服务器的多次往返,那么一种方法是编写一个既执行插入,又使用

Set @Pk = Scope_Identity() 
在第一次插入之后,获取为第一次插入创建的标识值,然后将该@Pk值用于第二次插入

这里有一个简单的例子

Create Procedure SaveEmployee
@Name varChar(30),
@DivId Int,
@HomePhoneNumber VarChar(12),
@FaxNumber VarChar(12)
As
Set NoCount On
Declare @Pk Integer


   Insert Employees(Name, Divisionid)
   Values(@Name, @DivId)
   Set @Pk = Scope_Identity()
   -- ------------------------------------------------
   Insert PhoneNums(EmployeeId, PhoneType, PhoneNumber)
   Values(@Pk, 'Home', @HomePhoneNumber)
   -- ------------------------------------------------
   Insert PhoneNums(EmployeeId, PhoneType, PhoneNumber)
   Values(@Pk, 'Fax', @FaxNumber )

   Return 1

在SQL Server 2005及更高版本中,可以使用OUTPUT子句将新键值传递到第二个表中:

INSERT INTO T ...
OUTPUT PrimaryKeycol, otherValues INTO ChildTable;
SQLServer2008中还存在其他可能性,包括“composableDML”和MERGE语句

在回复评论时添加:

create table T(i int identity(1,1), j int, k int default -1);
go

merge into T using (values (1), (2)) as U(j)
on U.j = T.j
when not matched then insert (j) values (j)
output inserted.i, inserted.k;
go

drop table T;

它可能已经过了有用的阶段,但这指出了使用代理主键的固有困难,尤其是在其他表中将它们用作外键时。如果使用自然键定义关系,则从一开始就知道要插入哪些值。

实际上,脚本正在服务器上运行。我试图避免的是游标。目标表中已经有数据,所以我必须从中获取标识值。此外,该系统将运行,所以我不能做一个最大(id)+1。我刚刚把更多的信息。。。解释重新设定的内容。。。也许这对你有用我没有定义模式,那些控制模式的人都在代理键阵营。无论如何,我不确定哪个自然键适合所讨论的表-唯一可能的候选userId+title,但实际上没有一条业务规则要求标题必须是唯一的,而且可能有一条业务规则基于业务规则约束数据库,而不是相反,对吧?这是最接近我要找的。唯一的缺点是,OUTPUT子句只能访问目标表中指定的列,这是一个鸡和蛋的问题-如果我在目标表中插入了唯一的内容,我可以在目标表上连接以获得插入的ID。但是,我接受你的答案是因为它教会了我一些新的东西。提示:如果使用MERGE而不是INSERT,那么可以在OUTPUT子句中包含未提及的列。我将在我的答案中添加一个例子。