存储过程根据条件

时间:2018-04-10 01:19:32

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

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

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

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

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

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

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

  • INSERT - 如果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

1 个答案:

答案 0 :(得分:0)

插入

之类的东西怎么样?
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

和更新

X1.Name    X1.ID  X1.Prac   X1.SCD

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

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