2016-03-22 4 views
1

Я написал следующее хранимую процедуру, которая динамически создает один оператор обновления для обновления продукта таблицы с соответствующими значениями, извлекаемых из Правиле1 и Rule2 столов на определенных условиях присоединиться.Динамическая генерация запроса обновления

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

исходные значения, которые присутствуют в продукте таблица может или не может быть NULL,. Мне нужно проверить, не совпадают ли исходные значения, а затем обновить соответствующий столбец значением.

здесь код зра:

CREATE PROCEDURE [dbo].[UpdateCTFamilyRules] 
    AS  
    BEGIN  
     DECLARE @T_1 NVARCHAR(100) = NULL 
     DECLARE @T_2 NVARCHAR(100) = NULL 
     DECLARE @Fl NVARCHAR(100) = NULL  

     DECLARE @T1 NVARCHAR(100) = NULL 
     DECLARE @T2 NVARCHAR(100) = NULL  
     DECLARE @F NVARCHAR(100) = NULL 

    Select @T_1 = p.T1, 
      @T_2 = p.T2, 
      @Fl = p.F 
    from Product p 
    where p.Manufacturer_Name = 'Dell'; 


    Select @T1 = r2.T1, 
      @T2 = r2.T2, 
      @F = r2.F 
    from Product p 
    join Rule1 r1 on p.Product_Code = r1.Product_Code 
    join Rule2 r2 on r1.MajorCode = r2.Product_Family 
    where p.Manufacturer_Name = 'Dell';   

    BEGIN  
     DECLARE @sqlCommand VARCHAR(8000)  
     DECLARE @Starter VARCHAR(100) 

     SET @Starter = 'SET ' 
     SET @sqlCommand = 'UPDATE Product ' 

     BEGIN    
      IF (@T1 IS NOT NULL) AND (@T1 <> @T_1) BEGIN SET @sqlCommand = @sqlCommand + @Starter + 'T1 = ''' + @T1 + '''' SET @Starter = ', ' END 
      IF (@T2 IS NOT NULL) AND (@T1 <> @T_2) BEGIN SET @sqlCommand = @sqlCommand + @Starter + 'T2 = ''' + @T2 + '''' SET @Starter = ', ' END 
      IF (@F IS NOT NULL) AND (@F <> @Fl) BEGIN SET @sqlCommand = @sqlCommand + @Starter + 'F = ''' + @F + '''' SET @Starter = ', ' END  
     END 

     -- if any one column get updated in DB then automatically starter sets to , then execute dynamic sqlCommand else ignore.. 

     IF (@Starter = ', ') 
     BEGIN  
      SET @sqlCommand = @sqlCommand + @Starter + ' Last_Modify_Date = ''' + CONVERT(VARCHAR(22),SYSDATETIME(),121) + '''' 
      SET @sqlCommand = @sqlCommand + ' from Product p 
       join Rule1 r1 on p.Product_Code = r1.Product_Code 
       join Rule2 r2 on r1.MajorCode = r2.Product_Family 
       WHERE p.Manufacturer_Name = ''' + 'Dell' + ''''   
      EXEC (@sqlCommand) 
     END  
    END 
END 

Пожалуйста, дайте мне, где это проблема сравнения я делаю с помощью обнуляемых колонок. И если это то, как я могу его изменить. Благодарю.

+1

Есть ли только одна строка для Manufacturer_Name = 'Dell' в таблице Product? – Aditya

+0

Я хочу проверить, являются ли столбцы T1, T2 и F в оригинальной ** Таблице продукта ** нулевыми или имеют некоторое значение. Если значение null или другое значение, отличное от того, что происходит от объединения, обновите этот столбец, оставив его как есть. – sarfarazit08

+0

@Aditya: Да, он вернет несколько записей. Мне нужно получить все такие записи после присоединения. А затем проверьте, нет ли в таблице Product записей null или какого-либо другого значения, если да, то после этого обновите таблицу продуктов с выбранными значениями один за другим. Нужны ли мне курсоры для этого? – sarfarazit08

ответ

0

Почему вы не пытаетесь использовать MERGE UPDATE в SQL Server?

MERGE Prodcut AS TARGET 
USING (
     SELECT R2.Manufacturer_Name, 
       R2.T1, 
       R2.T2, 
       R2.F 
     FROM  Product P 
       INNER JOIN Rule1 R1 ON P.Product_Code = R1.Product_Code 
       INNER JOIN Rule2 R2 ON R1.MajorCode = R2.Product_Family 
     ) AS SOURCE (Manufacturer_Name, T1, T2, F) 
     ON (TARGET.Manufacturer_Name = SOURCE.Manufacturer_Name) -- Match on condition 
WHEN MATCHED AND (TARGET.T1 <> SOURCE.T1 OR 
        TARGET.T2 <> SOURCE.T2 OR 
        TARGET.F <> SOURCE.F) -- Find non matched columns 
THEN 
UPDATE SET TARGET.T1 = SOURCE.T1, 
      TARGET.T2 = SOURCE.T2, 
      TARGET.F = SOURCE.F -- Update non matched columns 

Примечание: Пожалуйста, проверьте код на тестовой базе данных & изменения по мере необходимости.

Смежные вопросы