我正在尝试从用户定义的表类型获取数据,该类型的值需要插入到父表和子表中。在下面存储的过程中,我使用单独的SELECT语句从User Defined Table获取值并将其插入Parent&Child表。
问题:
不是使用两个select语句,而是有可能使用单个SELECT语句从User Defined表中获取所需的列?
我一直在使用Commit&Rollback Tran。如果在将记录插入到父表中时发生任何异常,它将转到Catch块,但是标识值将被跳过一个。例如。我在用户定义的表格中有3条记录,处理第二条记录时出现错误。第1条记录和第3条记录的“父表”的Identity Column值应为“ 101&102”,但要插入为“ 101&103”。
是否有其他方法可以将记录从用户定义的表插入到Parent \ Child表中,以获取每次插入的状态,无论是成功还是失败。
我的代码:
CREATE PROCEDURE [dbo].[SP_Insert]
@insertTable [dbo].[UserDefindTable] READONLY
AS
BEGIN
--Getting Total Record Count
DECLARE @totalRecords int = isnull((select count(1) from @insertTable), 0)
--Counter value for while..loop
DECLARE @counter int = 1
--Getting Identity column value from the Parent table
DECLARE @IdentityColumn as int
--Return table with Success\Failure status
DECLARE @returnTable TABLE (ID INT identity(1, 1),[resultId] varchar(50),isSuccess bit)
DECLARE @KeyValue VARCHAR(50)
WHILE (@counter <= (@totalRecords))
BEGIN
SET @KeyValue = (SELECT TOP 1 [KeyValue] FROM @insertTable where [row_id] = @counter)
BEGIN TRY
BEGIN TRAN
--Insert into Parent Table
INSERT INTO [ParentTable] (Col2,Col3,Col4,Col5)
(SELECT Col2,Col3,Col4,Col5 FROM @insertTable where [row_id] = @counter)
SET @IdentityColumn = SCOPE_IDENTITY()
--Insert into Child Table
INSERT INTO [ChildTable] (Col1, Col6, Col7)
(SELECT @IdentityColumn, KeyValue, Col7 FROM @insertTable where [row_id] = @counter)
--Insert into resultset table
INSERT INTO @returnTable ([KeyValue],isSuccess) VALUES (@KeyValue, 1)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
--Insert into resultset table
INSERT INTO @returnTable ([KeyValue],isSuccess) VALUES (@KeyValue, 0)
END CATCH
SET @counter = @counter + 1
END
SELECT * FROM @returnTable
END