Хранимая процедура INSERT из представления в таблицу на основе условий

Моя хранимая процедура вызывает 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

person Maverick    schedule 10.04.2018    source источник
comment
Вы можете найти полезную инструкцию MERGE: technet.microsoft .com / ru-ru / library / bb522522 (v = sql.105) .aspx   -  person Paul Michaels    schedule 10.04.2018
comment
@ pm_2 точно, я считаю, что оператор слияния будет полезен, просто пытаюсь понять его.   -  person Maverick    schedule 10.04.2018


Ответы (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, чтобы убедиться, что у нас есть запись, частично совпадающая

person NDUF    schedule 10.04.2018