I have a created a stored procedure (please ignore syntax errors)
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
table has an identity column ID
with is auto-generated ie. @outID1
and first insert query inserts only 1 row.
configpthmaster
table is not related to any other table directly and has 2 unique data rows, which I want to fetch to insert data into other tables, one by one during insertion.
The second insert query fetch data from configpthmaster
table and insert 2 rows in configdetails
while generating (auto-generated) ID ie. @outID2
.
It also has a FK mapped to server_details
.
The problem is "@outID2" giving last inserted ID only (ie. if two id generated 100,101 i am getting 101) which eventually on 3rd insertion, inserting 2 rows with same id 101 only but i want the insertion should be linear. ie one for 100 and other for 101.
If zero rows affected while insertion how to rollback the transaction?
How can I achieve these requirements? Please help.
Could you try this solution?
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_detials(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 isnull(replace(stuff((SELECT inserted.configid FOR xml path('')), 1, 1, ''), '&', '&'), '') ,cm.key, from configpthmaster cm where cm.appid = @appid )
begin
commit
end
I just added STUFF in your code.
The STUFF function inserts a string into another string.
Do take note that using STUFF drastically slows the processing time of the code.
for more information about STUFF
Change your procedure like below,and try again.
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.