23 Şubat 2017 Perşembe

SQL Server da Tüm Nvarchar(max) Alanların Tespit Edilip Düzenlenmesi


SQL Server da nvarchar(max) kullanımı database'i performans açısında negatif olarak etkiler. Tahmin edilebilir ve çok uzun değerler girilmeyecek alanlar için nvarchar(max)' tercih etmemek gerekir. Aşağıdaki kod'un çalışma mantığı database de tüm kullanıcı tablolarında kullanılan nvarchar(max) alanlarını tespit edip, o tablo içindeki maksimum değer girilen kolonun değerini bulur ve bu değerin %20'sini ekleyerek kolunun olması gereken karakter sınırını değiştirir. Eğer tablodaki kolonlarda 3000 den fazla girilmiş karakter varsa burada herhangi bir işlem yapmayacaktır. Bu durumda bu tablolar özelinde kendiniz gözden geçirip olması gereken sınıra karar vermelisiniz. Aksi taktirde bu işlem kritik bir müdahale olabilir. Eğer hiç veri girilmemiş bir kolon yada tablolarınız varsa burada scriptin referans alacağı bir kullanım değeri olmadığı için nvarchar(max) alanları default olarak 1500 ayarlanacaktır. Production ortamında kodu çalıştırmadan önce test ortamınız da test etmenizi öneriyorum. Umarım faydalı olur.

-------------------------------------------------------------------

DECLARE @tabload NVARCHAR(200)
DECLARE @maxdeger INT
DECLARE @kolonad NVARCHAR(200)
DECLARE @Id INT
DECLARE @FinalKomut NVARCHAR(400)
DECLARE @tabloCount INT
DECLARE @arakomut NVARCHAR(400)


SELECT ROW_NUMBER() OVER(ORDER BY(SELECT 100)) AS ID,
TABLE_SCHEMA+'.'+TABLE_NAME as TabloAd,
COLUMN_NAME AS Kolon
INTO ##ym
FROM
INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE in('varchar','nvarchar') AND CHARACTER_MAXIMUM_LENGTH = -1 AND TABLE_SCHEMA not like 'dbo%'
AND TABLE_NAME <> 'Tablo ismi'  --Eğer işleme dahil edilmesini istemediğiniz kolon ve tablo ismi varsa burada belirtebilirsiniz.


SELECT @tabloCount=COUNT(*) FROM ##ym

SET @ID=0

yukari:
set @Id = @Id +1

WHILE (@Id<=@tabloCount)
begin

SELECT
@Id=Id ,
@tabload=tabload,
@kolonad=Kolon
FROM ##ym
WHERE ID=@Id


set @arakomut =(' set @maxdeger =(select max(len('+@kolonad+')) from '+@tabload+')')
exec sp_executesql @arakomut,N'@maxdeger int out',@maxdeger out

IF @maxdeger IS NULL or @maxdeger = ''  -- Eğer tablonun tüm satırları null yada boşsa default olarak nvarchar(1500) olarak ayarladım. Siz ihtiyaca göre buradaki alan değerini değiştirebilirsiniz.
begin
begin tran
SET @FinalKomut = 'alter Table '+@tabload+' alter column '+@kolonad+'  nvarchar(1500)'
EXEC sp_executesql @FinalKomut
print @tabload+' '+@kolonad+' Tablo Boş nvarchar(1500) olarak ayarlandı'
commit
goto yukari
end

IF (@maxdeger)>3000

BEGIN
begin tran
 PRINT @tabload+' '+@kolonad+' 3000 den büyük değer var.İşlem Yapılmayacak' -- Eğer karakter sayısı 3000'den fazla veri varsa burası kritik olduğu için herhangi bir işlem yapmamsını tavsiye ediyorum. Bu tablolar özelinde ekranları kullanan kişiler ile konuşuarak optimum bir değer belirlenmelidir.

commit
goto yukari

END

IF (@maxdeger)<3000 -- Eğer 3000 den küçükse tablo içerisnde maksimum karatker sayını bulup bunun %20'si kadar ekleyerek yeni nvarchar değerini atayacaktır.
BEGIN
begin tran
set @maxdeger = cast(@maxdeger*0.20 as int)+@maxdeger
SET @FinalKomut = 'alter Table '+@tabload+' alter column '+@kolonad+'  nvarchar('+cast(@maxdeger as varchar(20))+')'
EXEC sp_executesql @FinalKomut
commit
print @tabload+' '+@kolonad+' kolonu data siniri degistirildi.'
SET @ID= @ID+1
end
END




0 yorum :

Yorum Gönder