Tabloda Geçen Değeri Bulma Ve Güncelleme | MsSql
Merhaba, çok sık olmasa da kimi zaman veritabanında bir değerin geçtiği tüm tablolarda o değeri güncelleme ihtiyacı olabilir.
Çok tasvip edilmeyen bir durum olsa da, bir gün ihtiyacınız olursa faydasını görebilirsiniz diyerek sizinle de paylaşmak istedim.
Benim örneğimde bir cari numarasının güncellenmesi yer alıyor. Bu carinin geçtiği tüm tabloları dolaşıp güncelleme scriptini oluşturuyorum.
Bunu bir SP haline getirebilirsiniz. En son oluşan scripti de, ExecuteSql ile çalıştırabilirsiniz.
Belki 1-2 tanesini kendiniz çalıştırıp başarı elde ettikten sonra yapsanız daha sağlıklı olur.
Örneğimizde CANIAS ERP’de cari kodunun diğer tablolarda nasıl ifade edildiğine göre bir WHERE koşulu oluşturdum. Finans tablolarında ACCOUNT, satınalma tablolarında VENDOR ve diğer tablolarda da çoğunlukla CUSTOMER olarak geçtiği için bu şekilde bir koşul oluşturdum.
DECLARE @arananDeger nvarchar(20) = 'MST0001';
DECLARE @atanacakDeger nvarchar(20) = 'MST0099';
DECLARE @whereKosulu nvarchar(250) = ' CLIENT = ''00'' AND COMPANY = ''01'' AND ';
DECLARE @strSql nvarchar(MAX) = '';
DECLARE @tblTablo TABLE (KolonAdi NVARCHAR(50), TabloAdi NVARCHAR(50));
select @strSql = @strSql + ' SELECT ''' + c.[name] + ''' AS KolonAdi, ''' + t.[name] + ''' AS TabloAdi FROM ' + t.[name] + ' WITH (NOLOCK) WHERE ' + c.[name] + ' = ''' + @arananDeger + ''' UNION '
from sys.schemas s
inner join sys.tables t on s.schema_id = t.schema_id
inner join sys.columns c on t.object_id = c.object_id
inner join sys.types d on c.user_type_id = d.user_type_id
where (c.name like '%CUSTOMER%'
OR c.name like '%ACCOUNT%'
OR c.name like '%VENDOR%'
OR c.name like '%CUST%')
AND d.[name] LIKE '%char%'
-- Sondaki UNION icin asagida bir bos satir ekliyorum.
SET @strSql = @strSql + ' SELECT '''' AS KolonAdi, '''' AS TabloAdi ';
INSERT INTO @tblTablo
EXEC(@strSql);
SELECT KolonAdi, TabloAdi,
' SELECT * FROM ' + TabloAdi + ' WITH (NOLOCK) WHERE ' + KolonAdi + ' = ''' + @arananDeger + ''';',
' UPDATE ' + TabloAdi + ' SET ' + KolonAdi + ' = ''' + @atanacakDeger + ''', CHANGEDAT = GETDATE(), CHANGEDBY = ''OTOM'' WHERE ' + @whereKosulu + KolonAdi + ' = ''' + @arananDeger + ''';'
FROM @tblTablo WHERE TabloAdi != '';
Selamlar.