受这个问题的启发,我对一个INSTEAD OF
INSERT触发器进行了以后的检验,提出了一个使用临时表的解决方案,该临时表
#inserted是该
inserted表的完整副本。
触发器在该表上添加了一个临时标识列,从而可以使用唯一值遍历插入的行。
剩下的就是使用游标的简单循环,该游标首先将每一行插入到父表中,然后使用
SCOPE_IDENTITY()插入子行。
与“为每列声明一个变量”解决方案相比,此解决方案具有优势,即您只需要获取临时标识值而不是所有列即可。
在性能方面,它可能不是很好,因为必须复制插入表中的所有数据。
SELECt * INTO [dbo].[#inserted] FROM [inserted]ALTER TABLE [dbo].[#inserted] ADD [temp_id] INT IDENTITY(1,1)DECLARE @temp_id intDECLARE cur CURSORFORSELECt [temp_id]FROM [dbo].[#inserted]OPEN curFETCH cur INTO @temp_idWHILE @@FETCH_STATUS = 0BEGININSERT INTO [dbo].[parent]( [name])SELECt [parent_name]FROM [#inserted]WHERe [temp_id] = @temp_idINSERT INTO child( [parent_id] , [name])SELECt SCOPE_IDENTITY() , [child_name]FROM [dbo].[#inserted]WHERe [temp_id] = @temp_idFETCH cur INTO @temp_idENDCLOSE curDEALLOCATE cur



