Üç 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ı?
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! –
@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
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. –