2016-03-22 24 views
1

Ich habe geschrieben gespeicherte Prozedur folgt, die eine Update-Anweisung dynamisch erstellt Produkt Tabelle mit den entsprechenden Werten von Rule1 und Rule2 Tabellen zu bestimmten Joinbedingungen geholt zu aktualisieren.Erzeugen Dynamisch Aktualisierungsabfrage

Das Problem, das ich mit Blick auf bin, ist, dass, wenn ich den Vergleich original Produkt Tabellenwerte mit den Werten von verbindet kommen, dann ist die Update-Abfrage bildet nicht.

die ursprünglichen Werte, die Tabelle in Produkt vorliegen können oder nicht NULL sein. Ich muss überprüfen, ob die ursprünglichen Werte nicht gleich sind, und dann die entsprechende Spalte mit dem Wert aktualisieren.

hier ist der sp-Code:

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 

Bitte lassen Sie mich, wo dieses Problem mit dem Vergleich ist ich bin mit Nullable-Spalte zu tun. Und wenn es dann ist, wie ich es modifizieren kann. Vielen Dank.

+1

Gibt es nur eine Zeile für Manufacturer_Name = 'Dell' in der Produkttabelle? – Aditya

+0

Ich möchte überprüfen, ob die Spalten T1, T2 und F in der ursprünglichen ** Produkt ** Tabelle null sind oder einen Wert haben. Wenn null oder ein anderer Wert als das, was von join kommt, dann aktualisiere diese Spalte sonst lass es so wie es ist. – sarfarazit08

+0

@Aditya: Ja, es werden mehrere Datensätze zurückgegeben. Ich muss alle diese Aufzeichnungen nach dem Beitritt holen. Und dann überprüfen Sie, ob die Produkttabelle Datensätze null oder einen anderen Wert hat, wenn ja, dann aktualisieren Sie die Produkttabelle nacheinander mit den abgerufenen Werten. Benötige ich Cursor, um dies zu tun? – sarfarazit08

Antwort

0

Warum versuchen Sie nicht MERGE UPDATE in 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 

Hinweis: Bitte testen Sie den Code auf Testdatenbank & ändern je nach Bedarf.