SQL查询-用户定义的数据表

时间:2019-04-28 00:24:08

标签: sql-server tsql

我正在尝试从用户定义的表类型获取数据,该类型的值需要插入到父表和子表中。在下面存储的过程中,我使用单独的SELECT语句从User Defined Table获取值并将其插入Parent&Child表。

问题:

  1. 不是使用两个select语句,而是有可能使用单个SELECT语句从User Defined表中获取所需的列?

  2. 我一直在使用Commit&Rollback Tran。如果在将记录插入到父表中时发生任何异常,它将转到Catch块,但是标识值将被跳过一个。例如。我在用户定义的表格中有3条记录,处理第二条记录时出现错误。第1条记录和第3条记录的“父表”的Identity Column值应为“ 101&102”,但要插入为“ 101&103”。

  3. 是否有其他方法可以将记录从用户定义的表插入到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

0 个答案:

没有答案