繁体   English   中英

如何将数据从源表(但不同的列)插入SQL服务器中的两个不同的表中

[英]How to insert data from source table (but different columns) into two different tables in SQL Server

我有一个名为 [Staging] 的临时表。 该表中的数据需要插入到两个单独的表中。 一半的列 go 到第一个表(我们称之为 [Table1]),另一半列 go 到第二个表(我们称之为 [Table2])

这两个表都有一个标题为“ChainID”的列。 在 [Table1] 中,ChainID 是一个标识列。 在 [Table2] 中不是。

当我们需要查询这些数据时,ChainID 是将这两个表链接在一起的一列。

我目前已将其设置为插入 [Table1] 的位置,然后生成新的 ChainIds。 我可以使用“OUTPUT INSERTED.ChainID”来获取生成的 ChainId,但我的问题是将其绑定回原始临时表,以便获取第二个表的数据的 rest。

    DECLARE @Staging TABLE
(
    [RowID] [int],
    [ChainID] [varchar](50) ,
    [LoanNo] [varchar](50) ,
    [AssignmentFrom] [varchar](4000),
    [AssignmentTo] [varchar](4000),
    [CustodianUID] [nvarchar](100) null,
    [DocCode] [nvarchar](100) null
)


INSERT 
    @Staging
SELECT
    RowID,
    ChainID,
    LoanNo,
    AssignmentFrom,
    AssignmentTo,
    CustodianUID,
    DocCode
FROM 
    [MDR_CSV].[dbo].[TblCollateralAssignmentChainImport]
WHERE
    UploadID = 1

这是我们插入第一个表的地方,该表生成新的chainId,需要合并到Table2中。

INSERT INTO 
    Table1

SELECT
    LoanNo,
    AssignmentFrom,
    AssignmentTo,
    CustodianUID
FROM 
    @Assignments AS MDRCA 
WHERE 
    MDRCA.ChainID IS NULL

现在我需要将 DocCode 字段中的数据插入到 Table2 中。 我可以通过执行以下操作来获取新生成的 ChainIds 列表

OUTPUT INSERTED.ChainID 

但这无助于将新生成的 chainId 绑定到 Staging 表中的相应数据行,以便插入到 Table2 中。

我最终想出了一个解决方案。 我使用光标指向 go 逐行通过暂存表中的每一行数据。 这使我可以插入第一个表(仅包含临时表中的相关列)以及执行 OUTPUT.INTERTED ChainID 并将新生成的 ChainID 存储到表变量中。 然后我通过执行将该 ChainID 值分配给常规变量

@ChainID = (SELECT TOP 1 * FROM @tableVariable)

然后,我可以使用此 ChainID 与来自暂存表的数据的 rest 一起插入到第二个表中,这些数据与同一行数据有关(这可能是由于光标)

然后在光标循环之前,我删除表变量并在循环顶部重新创建它,以便 SELECT TOP 1 每次都能正常工作。

不确定这是否是 go 的最佳或更有效的方法,但至少它有效!

下面是一个例子,展示了我是如何让它工作的:

TblCollateralAssignmentChainImport 是暂存表

temp_tblCollateralAssignment 是 Table1

temp_CustodianData 是表 2

DECLARE @RowID int, @ChainID int;

DECLARE import_cur CURSOR FOR     
SELECT RowID   
FROM [MDR_CSV].[dbo].[TblCollateralAssignmentChainImport]
WHERE ChainId IS NULL
order by RowID;    

OPEN import_cur    

FETCH NEXT FROM import_cur     
INTO @RowID   

WHILE @@FETCH_STATUS = 0    
BEGIN    

DECLARE @NewlyCreatedChainId table (nChainId int);

INSERT INTO temp_tblCollateralAssignment
OUTPUT INSERTED.ChainID INTO @NewlyCreatedChainId
SELECT LoanNo, AssignmentFrom, AssignmentTo
FROM TblCollateralAssignmentChainImport
WHERE RowId = @RowID

SET @ChainID = (SELECT TOP 1 nChainId FROM @NewlyCreatedChainId)

INSERT INTO temp_CustodianData (ChainID, LoanNo, CustodianUID, DocCode)
SELECT @ChainID, import.LoanNo, import.CustodianUID, import.DocCode
FROM TblCollateralAssignmentChainImport AS import
WHERE RowId = @RowID

DELETE FROM @NewlyCreatedChainId
 
FETCH NEXT FROM import_cur     
INTO @RowID  

END     
CLOSE import_cur;    
DEALLOCATE import_cur; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM