Posts Tagged ‘tsql’
T-Sql String’i parçalara ayırma
Merhaba, Birçok noktada işimizi kolaylaştırabilecek bir T-Sql fonksiyonunu anlatmak istiyorum. Önce soruna bakalım :
Elimizde bulunan :
Excel 2000, Excel XP, Excel 2003, Excel 2007, Excel 2010
şeklindeki bir yazıyı bir tabloya dönüştürmek istiyoruz diyelim. Bu string’i (,) karakterinden parçalamamız (split) gerekir.
İşte çözüm:
DECLARE @ara AS NVARCHAR(MAX) SET @ara = N'Excel 2000, Excel XP, Excel 2003, Excel 2007, Excel 2010'; SELECT * FROM dbo.Split ( @ara , ',');
İyide Bu dbo.Split ne diyebilirsiniz. Güzel soru, cevabıda şu :
-- SQL Server 2005 ve 2008 de çalışabilecek, String'i parçalara ayırmayı sağlayan bir araçtır.
CREATE FUNCTION dbo.Split
(
@Text NVARCHAR(MAX) , -- Parçalanacak string'i içerecek
@Seperator NVARCHAR(20)) -- Ayraç
RETURNS @sonuc TABLE ( Item NVARCHAR(MAX) ) -- sonuç olarak bir tablo sonucu dönecek
AS
BEGIN -- işte başlıyoruz.
IF @Text IS NOT NULL AND LEN(@Text) > 0 -- önce gelen veri var mı kontrolü
BEGIN
IF CHARINDEX(@Seperator, @Text) = 0 -- Eğer ayraçtan hiç string'de yok ise o zaman yazıyı tek bir parça olarak göndeririz.
BEGIN
INSERT INTO @sonuc
VALUES ( @Text )
END
ELSE
BEGIN
WITH ara AS ( -- gelelim işin en zevkli tarafına recursive sorgulama ile sisteme parçalara ayıralım.
SELECT -- önce ilk satır
LTRIM(RTRIM(SUBSTRING(@Text, 1, CASE CHARINDEX(@Seperator, @Text) WHEN 0 THEN LEN(@Text) ELSE CHARINDEX(@Seperator, @Text) - 1 END))) AS a, -- ilk ayraçtan önceki kısım alınır.
LTRIM(RTRIM(SUBSTRING(@Text, CASE CHARINDEX(@Seperator, @Text) WHEN 0 THEN LEN(@Text) ELSE CHARINDEX(@Seperator, @Text) + LEN(@Seperator) END, LEN(@Text)))) AS b -- ilk ayraçtan sonraki kısım alınır.
UNION ALL -- recursive kısım başlıyor.
SELECT -- Son eklenen satırdan yeni bir satır oluşturuluyor
LTRIM(RTRIM(SUBSTRING(b, 1, CASE CHARINDEX(@Seperator, b) WHEN 0 THEN LEN(b) ELSE CHARINDEX(@Seperator, b) - 1 END))), -- ayraçtan önceki kısım alınır
LTRIM(RTRIM(SUBSTRING(b, CASE CHARINDEX(@Seperator, b) WHEN 0 THEN LEN(b) + 1 ELSE CHARINDEX(@Seperator, b) + 1 END, LEN(b)))) -- ayraçtan sonraki kısım alınır
FROM ara -- Recursive olayını yapan kısım. Dikkat ederseniz CTE kendini çağırıyor.
WHERE LEN(b) > 0 -- işte döngüyü dizginleyen arkadaş. Eğer b boşsa iş bitmiştir. Bu olmaz ise sonsuz döngüye girer
)
INSERT INTO @sonuc -- Sonuçlar iade alanına yazılıyor.
SELECT a -- sadece ilk kolon yeterli
FROM ara -- CTE
END
END
RETURN -- işte bu kadar
END
Gördüğünüz bu fonksiyon işini çok iyi yapıyor. Bazı kontrollere belki gerek olmayabilir, veya daha fazla kontrole gerek olabilir ama bu bile bir çok görevi yerine getirebilir.
Kolay Gele
SQL Server Veri tabanlarında transaction log dosyasının en küçük boyuta indirilmesi.
Bildiğiniz gibi SQL SERVER transaction log dosyaları veri tabanları üzerindenki bütün hareketleri tutmaktadırlar. bu hareketler belli bir süre sonra veri tabanının alanını aşan bir duruma gelebilir. Böyle bir durumda transaction log dosyasındaki eski hareketleri temizleyip, dosyanın boyutunu düşürmeyi düşünebilirsiniz.
Bu durumda aşağıdaki komutları kullanabilirsiniz.
USE DatabaseAdı
GO
DBCC SHRINKFILE(<TransactionLogDosyasınınAdı>, 1)
BACKUP LOG <DatabaseAdı> WITH TRUNCATE_ONLY
DBCC SHRINKFILE(<TransactionLogDosyasınınAdı>, 1)
GO
DİKKAT : Bu yöntemi veri tabanınızda kullanırken dikkatli olmalısınız. işleme başlamadan önce veri tabanının yedeğini almanızda büyük fayda var. Ayrıca komutu kullanmanız halinde oluşabilecek problemlerden yazar sorumlu tutulamaz. Komutu kullanırken oluşacak riskleride kabul etmiş sayılırsınız.
