【问题标题】:Stored procedure INSERT from view into Table based on conditions存储过程根据条件从视图 INSERT 到表中
【发布时间】:2018-09-19 11:54:18
【问题描述】:

我的存储过程调用了一个 API,该 API 生成了一个可使用的数据视图。我需要将生成视图中的记录插入到本地表中。

到目前为止,过程如下所示。

  • 生成的消耗品视图是[vw_OriginalView_Temp]
  • 需要插入数据的本地表是LocalTable。此表没有任何主键。

插入和更新以及跳过重复项的条件

  • SKIP - 如果本地表中存在与 CustomerGatcaStatusId, AccessNumber, AscertainMethodID, ExtendedStatusId, LastModifiedDate, LastModifiedBy, LastReviewedBy 精确组合的记录。

  • 更新 - 如果存在与CustomerGatcaStatusId, AccessNumber, AscertainMethodID, ExtendedStatusId 精确组合的记录,则使用来自视图vw_OriginalView_Temp 的值更新LastModifiedDate, LastModifiedBy, LastReviewedBy 的值

    李>
  • 插入 - 如果CustomerGatcaStatusId, AccessNumber, AscertainMethodID, ExtendedStatusId 的任何组合在Local 表中尚不存在。

如果您需要进一步说明,请提出建议并随时发表评论。感谢您的帮助。

ALTER PROCEDURE [dbo].[StoredProcedure1]
AS
BEGIN
    DECLARE @return_value INT,
            @RetCode INT,
            @RunID,
            @IntraDayID INT

    SET @RunID = NULL
    SET @IntraDayID = NULL

    EXEC @return_value = [Staging].[API_GenerateTempView]
                           @SchemaName = N'XXXX',
                           @ViewName = N'vw_OriginalView',
                           @ColumnList = N'CustomerGatcaStatusId, AccessNumber, AscertainMethodID, ExtendedStatusId, LastModifiedDate, LastModifiedBy, LastReviewedBy',
                           @OrderByList = NULL,
                           @ResultSet = 1,                           
                           @RunID = @RunID,
                           @IntraDayID = @IntraDayID,
                           @RetCode = @RetCode OUTPUT


    INSERT INTO LocalTable(CustomerGatcaStatusId, AccessNumber, AscertainMethodId, ExtendedStatusId, LastModifiedDate, StatusCode, LastModifiedBy, LastReviewedBy)
       SELECT 
           CustomerGatcaStatusId, AccessNumber, AscertainMethodId, 
           ExtendedStatusId, LastModifiedDate, '11', LastModifiedBy, LastReviewedBy 
       FROM 
           [XXXX].[vw_OriginalView_Temp]

    --IF EXISTS (SELECT * FROM AeoiSdtTemp)
    --BEGIN
    --  DELETE FROM AeoiSdtTemp
    --END
END

【问题讨论】:

标签: sql sql-server stored-procedures insert-update sql-merge


【解决方案1】:

插入的东西怎么样

INSERT INTO LocalTable(...)
SELECT (...) FROM [XXXX].[vw_OriginalView_Temp] _Temp left 
outer join LocalTable _Local on _Temp.a = _Local.a and _Temp.b = _Local.b 
where _Local.a is null and _Local.b is null

为了更新

UPDATE _Local
SET _Local.c = _Temp.c, _Local.d = _Temp.d
FROM LocalTable _Local 
left outer join TempTable _Temp on _Temp.a = _Local.a and _Temp.b = _Local.b and _Temp.c = _Local.c and _Temp.d = _Local.d
where _Temp.a is not null and _Temp.b is not null and _Temp.c IS NULL and _Temp.d IS NULL

未经测试,但我想你明白了吗?

对于插入,执行左外连接并测试 NULL 检查是否没有匹配此条件的现有记录 对于更新,我们使用相同的机制,但有时确保为 NULL,有时为 NOT NULL 以确保我们有部分匹配的记录

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多