Запрос обновления ADVANECE SQL

Вопрос:

Требуется обновить приток, проверив условие какое значение мы имеем в столбце приток в таблице отчетов
e.g если у нас есть случай, когда FLAG = ‘1’, то ‘ AS ‘ELSE’ LI ‘он должен проверить значение для столбца flag, если это 1, то значение должно быть’ as ‘else ‘ L1’
Примечание: столбец притока в отчете имеет разные значения.

структура таблицы:

create table dummy ( ID VARCHAR(10), PRODUCT VARCHAR(10), INFLOW VARCHAR(10) ); 
INSERT INTO dummy(ID,PRODUCT) VALUES('10','999') 
INSERT INTO dummy(ID,PRODUCT) VALUES('11','888') 
INSERT INTO dummy(ID,PRODUCT) VALUES('12','111') 
INSERT INTO dummy(ID,PRODUCT) VALUES('13','222')

create table REPORTING_FLAG
(
ID VARCHAR(10),
PRODUCT VARCHAR(10),
INFLOW VARCHAR(2000),
FLAG VARCHAR(10),
L3 VARCHAR(10)
);

INSERT INTO REPORTING VALUES('10','999','CASE WHEN FLAG = ''1'' THEN ''AS'' ELSE ''LI''','1','SALR') 
INSERT INTO REPORTING VALUES('11','888','CASE WHEN L3 = ''SALR'' THEN ''SALR'' ELSE ''OTHR''','1','XYZ') 
INSERT INTO REPORTING VALUES('12','111','ABC','2','PQR') 
INSERT INTO REPORTING VALUES('13','222','SAP','3','QWE') 

2 ответа

  1. При выполнении больших вставок целесообразно и правильно применять логику для выполнения преобразований над наборами данных, а не каждой отдельной строкой.

    Даже если это неизбежно,не совершайте ошибку, будучи комфортно с мириадами инструкций update/insert, которые не только стоит ресурсов, но и разбивает статистику, фрагментирует ваши индексы и диски.

    Выполните инструкцию SELECT, использующую логику случая, и проверьте результаты. Как только вы сможете безопасно выполнить это в инструкции select, преобразуйте ее в инструкцию Update (Примечание.)

  2. Это должно работать

    declare dummyproducts cursor for select ID, Product, Inflow from reporting
    declare @ID VARCHAR(10), @PRODUCT VARCHAR(10), @INFLOW VARCHAR(2000)
    OPEN dummyproducts
    Fetch next from dummyProducts into @ID, @PRODUCT, @INFLOW
    while @@fetch_Status = 0
    BEGIN
        declare @sql nvarchar(max)
        if CHARINDEX('CASE', @INFLOW) > 0
            set @Inflow = @inflow + ' end'
        else
            set @inflow = 'r.inflow'
        set @sql = 'Update dummy set INFLOW = ' + 
                        @INFLOW  
                    + ' from
                    reporting r inner join dummy d on r.Product = d.Product and r.ID = d.ID where d.ID =  ' + @ID + ' and d.Product = ' + @Product
        print @sql
        exec (@sql)
        Fetch next from dummyProducts into @ID, @PRODUCT, @INFLOW
    END
    close dummyProducts
    deallocate dummyProducts
    GO