我创建了一个存储过程(请忽略语法错误)
alter proc usp_newServerDetails
(@appid int, @envid int, @serType varchar(20), @servName varchar(20))
as
declare @oTbl_sd table (ID int)
declare @outID1
declare @oTbl_cd table (ID int)
declare @outID2
begin Transaction
insert into server_details(envid, servertype, servername)
output inserted.serverid into @oTbl_sd(ID)
values(@envid, @serType, @servName)
select @outID1 = ID from @oTbl_sd
insert into configdetails(serverid, servertype, configpath, configtype)
output inserted.configid into @oTbl_cd(ID)
(select @outID1, cm.servertype, cm.configpath, cm.configtype
from configpthmaster cm
where cm.appid = @appid )
select @outID2 = ID from @oTbl_cd
insert into configkeydetails(confiid, keyname)
output inserted.Keyid into @oTbl_ckd(ID)
(select @outID2, cm.key
from configpthmaster cm
where cm.appid = @appid)
begin
commit
end
server_details
表有一个身份列 ID
,它是自动生成的,即。 @outID1
并且第一个插入查询仅插入 1 行。
configpthmaster
表不与任何其他表直接相关,并且有 2 个唯一的数据行,我想在插入过程中获取这些数据以将数据一一插入到其他表中。
第二个插入查询从configpthmaster
表中获取数据
并在生成(自动生成)ID 时在 configdetails 中插入 2 行,即。 @outID2
。
它还有一个映射到 server_details
的 FK。
问题是“@outID2”仅给出最后插入的ID(即,如果两个id生成100,101,我得到101),最终在第三次插入时,仅插入具有相同id 101的2行,但我希望插入应该是线性的。即一个代表 100,另一个代表 101。
如果插入时影响零行如何回滚事务?
我怎样才能达到这些要求?请帮忙。
最佳答案
按如下方式更改您的程序,然后重试。
ALTER PROCEDURE usp_newServerDetails(@appid int, @envid int,@serType varchar(20),@servName varchar(20))
AS
BEGIN
BEGIN TRY
DECLARE @Output TABLE (ID int,TableName VARCHAR(50),cmKey VARCHAR(50)) --table variable for keeping Inserted ID's
BEGIN TRAN
IF EXISTS ( SELECT 1 FROM configpthmaster cm WHERE cm.appid = @appid )
AND ( SELECT 1 FROM configkeydetails ck WHERE ck.appid = @appid ) --add a conditon to satisfy the valid insertions
BEGIN
INSERT INTO server_detials(envid,servertype,servername)
OUTPUT inserted.serverid,'server_detials',NULL INTO @Output(ID,TableName,cmKey )
VALUES(@envid ,@serType ,@servName)
INSERT INTO configdetails(serverid,servertype,configpath,configtype)
OUTPUT inserted.configid,'configdetails',cm.Key INTO @Output(ID,TableName,cmKey )
SELECT t.ID,cm.servertype,cm.configpath,cm.configtype
FROM configpthmaster cm
CROSS APPLY (SELECT ID FROM @Output WHERE TableName='server_detials')t
WHERE cm.appid = @appid
INSERT INTO configkeydetails(configId,keyname)
SELECT ID,cmKey FROM @Output
WHERE TableName='configdetails'
END
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
END
关于sql - 插入查询通过 select 和 output 子句在表中插入多行。 SQL Server 2008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39911483/