SQL Server Diskte Kalan Boş Alan Tespiti

SQL Server üstlendiği rol gereği sürekli veri kaydı alan bir sistem ve üzerinde kurulu olduğu disk boyutunun belli aralıklarla kontrol edilmesi gerekmektedir. Yazımızda SQL Server veri tabanlarının üzerinde kurulu bulunduğu disklerin boş alanının tespit edilmesini üç yöntem ile inceliyor olacağız.

Birinci Yöntem

Bu yöntem ile sunucuda bulunan bütün disklerin boş alanı MB cinsinden sorgulanır.

EXEC MASTER..xp_fixeddrives

İkinci Yöntem

Bu yöntem de üzerinde veri tabanı dosyalarının olduğu disklerin boş alanı sorgulanıyor. Örnekte “C” ve “E” disklerinde veri tabanı dosyaları bolunuyor, bu sebeple yukarıdaki örnekte görünen “D” diski ile ilgili bilgi bulunmamaktadır.

SELECT DISTINCT dovs.logical_volume_name AS LogicalName,
dovs.volume_mount_point AS Drive,
CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs
ORDER BY FreeSpaceInMB ASC
GO

Üçüncü Yöntem

Bu yöntem ikinci yöntem ile aynı çalışmaktadır. Fark olarak her bir veri tabanı ve üzerinde bulunduğu diskin boyutunu farkı satırda vermektedir.

SELECT DISTINCT DB_NAME(dovs.database_id) DBName,
dovs.logical_volume_name AS LogicalName,
dovs.volume_mount_point AS Drive,
CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs
ORDER BY FreeSpaceInMB ASC
GO




SQL Server String Fonksiyonları

Yazılımın her alanında olduğu gibi SQL Server üzerinde de en sık yapılan işlemler string işlemleridir. Bu yazımızda SQL Server içerisinde kullanılan string fonksiyonlarını işliyor olacağız.

ASCII

Parametre olarak aldığı stringin ilk harfinin ASCII karşılığını verir.

SELECT ASCII('ABC') AS A, ASCII('B') AS B,   
ASCII('a') AS a, ASCII('b') AS b,  
ASCII(1) AS [1], ASCII(2) AS [2];

CHAR

ASCII fonksiyonunun tersine parametre olarak aldığı int değerinin karakter karşılığını vermektedir.

SELECT CHAR(65), CHAR(66), CHAR(97), CHAR(98), CHAR(49), CHAR(50)

CHAR fonksiyonu kullanılarak yeni satır, tab, satır başı gibi kontrol karakterleri de insert dilebilir. Örneğin aşağıdaki örnekte kişinin adı ve soyadı araya enter karakteri eklenerek alt alta yazıyor.

DECLARE @N NVARCHAR(40)
SET @N = 'Sait' + CHAR(13) + 'ORHAN'
PRINT @N

CHARINDEX

Verilen iki parametreden ilk verilen değeri ikinci parametre içerisinde arar ve bulduğu ilk indeksi verir. Üçüncü parametre de isteğe bağlı ve verilmesi durumunda verilen indekten sonrası için arar. Aranan değer bulunmaz ise 0 değerini döner.

select CHARINDEX('HAN', 'Sait ORHAN')
select CHARINDEX('HAN', 'Sait ORHAN', 7)

CONCAT 

Parametre olarak aldığı string değerlerini birleştirir.

SELECT CONCAT ( 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

CONCAT_WS

Concat fonksiyonu ile aynı şekilde çalışır ancak fark olarak stringleri birleştirirken araya ilk parametreyi koyar. Örneğin aşağıda yukarıdaki örneği “,” ile birleştiriyor.

SELECT CONCAT_ws (',', 'Bugün ', 'Günlerden ', 25, '/', '09' ) AS Tarih;

LEFT

İki parametre alır. İlk parametre bir string değer alır, ikinci parametre olarak bir int değer alır. Sonuç olarak int değeri kadar harfi stringin solundan döndürür.

SELECT LEFT('SAİT ORHAN', 3), LEFT('SAİT ORHAN', 4), LEFT('SAİT ORHAN', 6), LEFT('SAİT ORHAN', 7)

LEN

Parametre olarak aldığı string değerin uzunluğunu döndürür.

SELECT LEN('SAİT ORHAN')
------------Sonuç
-- 10

LOWER

Parametre olarak aldığı stringin tümünü küçük harfe çevirerek dödürür.

SELECT lower('SAİT ORHAN')
------------Sonuç
-- sait orhan

LTRIM

Parametre olarak aldığı stringin solunda olan bütün boşlukları kaldırır.

SELECT LTRIM('     SAİT ORHAN      ')

PATINDEX

İlk parametrede aldığı paterni ikinci parametrede verilen strin içerisinde arar ve bulduğu ilk indeki döndürür. Bulamazsa 0 döner.

select PATINDEX('%R_A%', 'SAİT ORHAN')
select PATINDEX('%R%', 'SAİT ORHAN')
select PATINDEX('SA%', 'SAİT ORHAN')
select PATINDEX('%AN', 'SAİT ORHAN')

REPLACE

Üç parametre alır. İkinci parametrede verilen string değeri birinci parametrede verilen string içerisinde arar ve üçüncü parametrede verilen değer ile değiştirir. Örneğin aşağıdaki örnekte “sai1orhan1” string değerinde geçen “1”leri “2” olarak değiştiriyor.

SELECT REPLACE('sai1orhan1', '1', '2')
--Sonuç
-- sai2orhan2

REPLICATE

Birinci parametrede verilen string değerini ikinci parametrede verilen sayı kadar tekrar ederek döner.

SELECT REPLICATE('12', 3)
--Sonuç
-- 121212

REVERSE

Verilen string değeri ters çevirir.

SELECT REVERSE('123456789')
--Sonuç
-- 987654321

RIGHT

LEFT fonksiyonu ile aynı çalışır. Farkı metni sağdan alıyor olmasıdır.

RTRIM

LTRIM fonksiyonu ile aynı çalışır. Farkı stringin sağındaki boşlukları siliyor olmasıdır.

SPACE

Parametre olarak aldığı sayı değeri kadar boşluk döndürür.

SELECT 'SAİT' + SPACE(7) + 'ORHAN'
SELECT 'SAİT' + SPACE(16) + 'ORHAN'
SELECT 'SAİT' + SPACE(2) + 'ORHAN'

STRING_AGG

Select sorgusunda birinci parametre olarak kendisine verilen kolon değerini ikinci parametrede verilen karakter ile bölerek gösterir. Aşağıdaki örnekte Code alanını arasına “,” koyarak gösteriyor

SELECT STRING_AGG(Code, ',') from DocsTypes
--Sonuç
-- EN,FR,KA,LS,OR,PL,PR,PS,SE,ST,TL,TS

STRING_SPLIT

Birinci parametrede verilen metni ikinci parametrede verilen karaktere göre ayrıştırır. Geriye value adında kolon barındıran ve satırlarında karaktere göre ayrıştırma sonucunu tutan bir tablo döner.

SELECT * from STRING_SPLIT('Bu metin boşluk karakterine göre ayrıştırılacak', ' ')

SUBSTRING

String içerisinden belli bir bölümü döndürür. Üç parametre alır. İlk parametrede işlem yapılacak string değeri, ikinci parametrede alınacak alt parçanın başladığı index değeri ve son parametre olarak da alınacak alt parçanın uzunluğunu alır.

SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 1, 4)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 5, 10)
SELECT  SUBSTRING('Bu metin boşluk karakterine göre ayrıştırılacak', 25, 1000)

--Sonuç
-- Bu m
-- etin boşlu
-- ine göre ayrıştırılacak

TRIM

LTRIM ve RTRIM ile aynı çalışır. Farkı stringin hem sağ hem solundan boşlukları siliyor olmasıdır.

UPPER

LOWER ile aynı çalışır. Verilen stringin tamamını büyük harfe çevirir.




SQL Server Veri Tabanının MySql Üzerine Taşınması

SQL Server piyasa da en sık kullanılan veri tabanlarının başında gelmektedir. Ancak özellikle SQL Server‘ın ücretli olması sebebi ile zamanla kullanıcılar sistemlerini MYSQL gibi ücretsiz bir veri tabanı sistemine geçirmek isteyebiliyorlar. Bu noktada eski verilerin ne olacağı, yeni sisteme nasıl taşınacağı problemi ortaya çıkmaktadır.

Veri taşıma işlemi için ücretli alternatifler olmasının yanında MYSQL‘in kendi içerinde de dahili gelen veri taşıma aracı bulunmaktadır. Aşağıdaki YouTube videomuzda bu işlemin nasıl yapıldığını işlemeye çalışıyoruz.




SQL Server Sunucu Adının Değiştirilmesi

SQL Server yüklü sunucunun adını değiştirdikten sonra SQL Server çalışmasında sıkıntılar oluşmaya başlamaktadır. Bu sebeple SQL yüklü bilgisayarın adını değiştirdikten sonra aşağıdaki adımları izleyerek SQL Server adının da değiştirilmesi gerekmektedir. Öncelikle aşağıdaki kod ile mevcut adını bulunur.

SQL Server Adının Bulunması

Sunucu yeniden adlandırılırken

  • Mevcut sunucu adı bilgisi sp_dropserver prosedurü ile sistemden silinir.
  • Yeni sunucu adı da sp_addserver prosedurü ile sisteme eklenir.

exec sp_dropserver 'eski_sunucu_adi';
go;
exec sp_addserver 'yeni_sunucu_adi', 'local';
go;

Bu işlemden sonra SQL Server servisi yeniden başlatılır ve sunucu adı select @@SERVERNAME ile kontrol edilir.




Tabloya En Son Ne Zaman Erişim Yapıldığını Sorgulama

SQL Server performans çalışmalarında sorulan soruların nerede ise başında “hangi tabloya ne zaman erişim sağlandı?” sorusudur. Aşağıdaki sql sorgusu tabloya ne zaman erişim sağlandığını gösterir.

SELECT DB_NAME(ius.[database_id]) AS [Database],
OBJECT_NAME(ius.[object_id]) AS [TableName],
MAX(ius.[last_user_lookup]) AS [last_user_lookup],
MAX(ius.[last_user_scan]) AS [last_user_scan],
MAX(ius.[last_user_seek]) AS [last_user_seek],
MAX(ius.[last_user_update]) AS [last_user_update]
FROM sys.dm_db_index_usage_stats AS ius
WHERE ius.[database_id] = DB_ID()
--AND ius.[object_id] = OBJECT_ID('YourTableName')
GROUP BY ius.[database_id], ius.[object_id]

Sorgu sonucunda gelen kolonların açıklaması:

  • last_user_lookup: Index olmayan bir kolon üzerinde where şartı ile sorgu çalıştığı zaman
  • last_user_scan: Tabloyu sıralı okuduğu zaman, “select * from Table” sorgusu gibi
  • last_user_seek: Tablodan tek değer okunduğu zaman, “select * from Table where Id = 5” sorgusu gibi

Tabloya En Son Ne Zaman Erişilmiş?




SQL Server Hesaplanmış Kolon Oluşturma




SQL Server Kolon Değerine Şart Ekleme

Veritabanı özelliklerinden biri de veri tutarlılığını sağlamaktır. Veritabanı tutarlılığı içinde uygulanan özelliklerden biri de kolona atanabilecek değer üzerine şart koşmaktır. Bu işlem SQL Server da SQL CHECK Constraint özelliği ile yapılmaktadır.




C# İle SQL Server İşlemleri

Yazılım geliştirme çoğunlukla veri saklama ve işleme amacıyla yapılır. Verilerin saklanması içinde bir veritabannı sistemi kullanılır. Videomuzda en çok kullanılan veritabanı sistemlerinden olan SQL Server’a C# ile işlem yapmayı öğreneceğiz.




SQL Server Mail Gönderme




SQL Server Database Mail Konfigurasyonu