0

Üç tablo Table1, Table2, Table3 var. Table1 ->Tier1, Tier2 ve Flag adreslerinde üç sütun oluşturdum ve may or may not be null. Bu tabloları ortak sütunlara ve updating bu üç sütuna göre yapıyorum.SQL Server'da saklı yordam aracılığıyla güncelleştirme

Kodum şu şekilde olmaktadır:

ALTER PROCEDURE [dbo].[SpUpdateTable] 
AS  
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRANSACTION; 
    BEGIN TRY  

     UPDATE Table1 
     SET Tier_1 = tbl3.T1, Modify_Date = SYSDATETIME() 
     FROM Table1 tbl1 
     JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1 
     JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2 
     WHERE tbl1.BrandName = 'Dell' AND 
     (tbl3.T1 IS NOT NULL AND tbl1.Tier_1 IS NULL OR tbl1.Tier_1 <> tbl3.T1); 

     UPDATE Table1 
     SET Tier_2 = tbl3.T2, Modify_Date = SYSDATETIME() 
     FROM Table1 tbl1 
     JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1 
     JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2 
     WHERE tbl1.BrandName = 'Dell' AND 
     (tbl3.T2 IS NOT NULL AND tbl1.Tier_2 IS NULL OR tbl1.Tier_2 <> tbl3.T2); 


     UPDATE Table1 
     SET Flag = tbl3.Flag, Modify_Date = SYSDATETIME() 
     FROM Table1 tbl1 
     JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1 
     JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2 
     WHERE tbl1.BrandName = 'Dell' AND 
     (tbl3.Flag IS NOT NULL AND tbl1.Flag IS NULL OR tbl1.Flag <> tbl3.Flag); 

    END TRY 
    BEGIN CATCH 
     IF @@TRANSCOUNT > 0 
      ROLLBACK TRANSACTION; 
      RETURN;   
    END CATCH 

    IF @@TRANSCOUNT > 0 
     COMMIT TRANSACTION; 
END 

Eh benim kod güncelliyor sütunları teker teker. Endişem, her bir sütunu güncellemek için hitting database'dur. Tek bir güncelleştirme sorgusu kullanarak bunu yapabileceğimiz bir yol var mı?

+5

Yan not: saklanan yordamlarınız için ** sp_' öneki kullanmamalısınız **. Microsoft [kendi kullanımı için öneki ayırmıştır (bkz. * Kayıtlı Yordamları İsme *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) ve Gelecekte bazen bir isim çatışması riskiyle karşı karşıyasınız. [Ayrıca saklı yordam performansınız için de kötüdür] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Sadece 'sp_''den kaçınmak ve önek olarak başka bir şey kullanmak ya da hiç bir önek kullanmamak en iyisidir! –

+0

@marc_s: Bu bilgi için teşekkürler, düzeltildi. Ama bu sadece adlandırma için. Doğrudan buraya yapıştıramamış gerçek kodu değiştirdim. – sarfarazit08

+0

Performansınıza yardımcı olacağından değil, daha yapıcı cevaplar alabilirsiniz: Bir bakışta neler olup bittiğini söylemek neredeyse imkansız ve işten çok fazla hoşlanıyor. Tablo3'e "Tablo3" ile daha anlamlı isimler vermek mümkün olabilir mi? Sadece yazdığınızı unutup unutmadan ve 'tblx.Flag' koşullarını tekrarlayan cümleleri okuyun. –

cevap

0

bu deneyin:

BEGIN TRY  

    UPDATE Table1 
     SET Modify_Date = SYSDATETIME(), 
      Tier_1 = CASE WHEN (tbl3.T1 IS NOT NULL AND tbl1.Tier_1 IS NULL OR tbl1.Tier_1 <> tbl3.T1) THEN 
         tbl3.T1 
        ELSE 
         Tier_1 
        END, 
      Tier_2 = CASE WHEN (tbl3.T2 IS NOT NULL AND tbl1.Tier_2 IS NULL OR tbl1.Tier_2 <> tbl3.T2) THEN 
         tbl3.T2 
        ELSE 
         Tier_2 
        END, 
      Flag = CASE WHEN (tbl3.Flag IS NOT NULL AND tbl1.Flag IS NULL OR tbl1.Flag <> tbl3.Flag) THEN 
         tbl3.Flag 
        ELSE 
         Flag 
        END 
    FROM Table1 tbl1 
    JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1 
    JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2 
    WHERE tbl1.BrandName = 'Dell' 
    AND 
    (
     (tbl3.T1 IS NOT NULL AND tbl1.Tier_1 IS NULL OR tbl1.Tier_1 <> tbl3.T1) 
     OR 
     (tbl3.T2 IS NOT NULL AND tbl1.Tier_2 IS NULL OR tbl1.Tier_2 <> tbl3.T2) 
     OR 
     (tbl3.Flag IS NOT NULL AND tbl1.Flag IS NULL OR tbl1.Flag <> tbl3.Flag) 
    ) 
END TRY 
BEGIN CATCH 
    --code to catch exception 
END CATCH 
+0

Bu sadece Tier_1 sütununu güncellemedi mi? –

+0

@TabAlleman doğru, güncellemelerin farklı sütunlar için olduğunu fark etmedim. Şimdi sabit. –

0

Böyle bir şey kullanmak istiyorum: NULL olduğu sürece

with x as (
    select tbl1.tier_1 tbl1_tier_1, tbl1.tier_2 tbl1_tier_2, tbl1.flag tbl1_flag, tbl3.t1, tbl3.t2, tbl3.flag 
    from table1 tbl1 
    join table2 tbl2 on tbl1.commoncolumn1 = tbl2.commoncolumn1 
    join table3 tbl3 on tbl2.commoncolumn2 = tbl3.commoncolumn2 
    where tbl1.brandname = 'Dell' 
) 
update x 
set 
    tbl1_tier_1 = isnull(tbl1_tier_1, t1), 
    tbl1_tier_2 = isnull(tbl1_tier_2, t2), 
    tbl1_tier_3 = isnull(tbl1_tier_3, t3), 
    modify_date = sysdatetime() 

O Table1 bir değer güncelleyecek, aksi takdirde mevcut değerini bırakacaktır.

+0

Merhaba, bu kod için teşekkürler. Kodunuz yalnızca NULL senaryosunu alıyor, ne sütun değeri farklıysa ve aldığımız değerle güncellemek istiyorum? Bu senaryoyu da dahil etmek istiyorum. – sarfarazit08

İlgili konular