Code-First ile Üretilmiş Migration’ların SQL Çıktısının Üretilmesi

Okuma Süresi: 1 dakika

Entity Framework Code-First yöntemi kullanılarak geliştirilmiş uygulamalarda add-migration ve update-database komutlarını Package Manager Console üzerinden çalıştırdığımızda uygulamamızın kullanmış olduğu Connection String üzerinden değişiklikleri veritabanına uygulayabiliyoruz.

Ancak üretilen bu migrationları veritabanında herhangi bir değişiklik yapmadan SQL çıktısı olarak alabilmek için aşağıdaki komutu kullanabiliriz.

Update-Database -Script -SourceMigration:0

Bu komut sayesinde yapmış olduğumuz tüm migrationların SQL çıktısı ekrana gelecektir.

SQL Server’da Komutların Çalışmasını Belli Bir Süre Bekletme

Okuma Süresi: 1 dakika

SQL Server’da çalıştırdığımız komutları belli bir süre bekletip tekrar çalıştırabilme olanağımız vardır. Bazı programlamla dillerinde bulunan Delay veya Thread.Sleep metodlarının aynısını SQL Server üzerinde de kullanabiliriz. WAITFOR DELAY komutu bu işlemi gerçekleştirmektedir.

Kullanımı aşağıdaki şekildedir:

-- 5 dakika bekletir.

WAITFOR DELAY '00:05';

-- 5 saniye bekletir.

WAITFOR DELAY '00:00:05';

-- 5 saat bekletir.

WAITFOR DELAY '05:00:00';

SQL Server’da Tüm Kolonların Collation’ını Değiştirme

Okuma Süresi: 1 dakika

SQL Server üzerinde veritabanının Collation’ını değiştirdiğiniz zaman Collation kolonlarda değişmeyebilir. SQL Server Management Studio’da tablo düzenlemesinden değiştirmek istediğinizde eğer tablo üzerinde veri varsa hata mesajıyla karşılaşacaksınız. Aşağıda bulunan T-SQL sorgusu veritabanındaki tüm tabloların tüm kolonlarının Collation’larını değiştirmektedir.

DECLARE @collate nvarchar(100);
DECLARE @table nvarchar(255);
DECLARE @column_name nvarchar(255);
DECLARE @column_id int;
DECLARE @data_type nvarchar(255);
DECLARE @max_length int;
DECLARE @row_id int;
DECLARE @sql nvarchar(max);
DECLARE @sql_column nvarchar(max);

SET @collate = 'Turkish_CI_AI';

DECLARE local_table_cursor CURSOR FOR

SELECT [name]
FROM sysobjects
WHERE OBJECTPROPERTY(id, N'IsUserTable') = 1

OPEN local_table_cursor
FETCH NEXT FROM local_table_cursor
INTO @table

WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE local_change_cursor CURSOR FOR

SELECT ROW_NUMBER() OVER (ORDER BY c.column_id) AS row_id
, c.name column_name
, t.Name data_type
, c.max_length
, c.column_id
FROM sys.columns c
JOIN sys.types t ON c.system_type_id = t.system_type_id
LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE c.object_id = OBJECT_ID(@table)
ORDER BY c.column_id

OPEN local_change_cursor
FETCH NEXT FROM local_change_cursor
INTO @row_id, @column_name, @data_type, @max_length, @column_id

WHILE @@FETCH_STATUS = 0
BEGIN

IF (@max_length = -1) SET @max_length = 4000;

IF (@data_type LIKE '%char%')
BEGIN TRY
SET @sql = 'ALTER TABLE ' + @table + ' ALTER COLUMN ' + @column_name + ' ' + @data_type + '(' + CAST(@max_length AS nvarchar(100)) + ') COLLATE ' + @collate
PRINT @sql
EXEC sp_executesql @sql
END TRY
BEGIN CATCH
PRINT 'ERROR: Some index or contraint rely on the column' + @column_name + '. No conversion possible.'
PRINT @sql
END CATCH

FETCH NEXT FROM local_change_cursor
INTO @row_id, @column_name, @data_type, @max_length, @column_id

END

CLOSE local_change_cursor
DEALLOCATE local_change_cursor

FETCH NEXT FROM local_table_cursor
INTO @table

END

CLOSE local_table_cursor
DEALLOCATE local_table_cursor

GO

@collate değişkenine kullanmak istediğiniz Collation değeriyle değiştirmeniz yeterlidir.

SQL Server’ın desteklediği Collation’ları listelemek için aşağıdaki T-SQL sorgusunu çalıştırmanız yeterlidir.

SELECT name, COLLATIONPROPERTY(name, 'CodePage') as Code_Page, description
FROM sys.fn_HelpCollations()

T-SQL’de Case Insensitive Sorunu

Okuma Süresi: 1 dakika

Bir T-SQL Like sorgusu yazarken gönderdiğim anahtar kelimenin karşılığını sorgu sonucunda göremiyordum. Problemin nedeni ise sorgumun case sensitive (büyük-küçük harf duyarlı) uyumuna göre sorgulamasından kaynaklanmaktaydı. Örnek olarak aşağıdaki gibi bir sorgu yazmıştım:

SELECT * FROM urun WHERE urunadi LIKE '%ice%'

Normalde Ice ve ice kelimeleri içinde geçen kayıtları döndürmesi gerekirken sadece ice içeren kayıtlar sorgu sonucu olarak dönüyordu. Sorunun çözümü için sorgumun sonuna karakter setinin case insensitive versiyonunu belirtmem yeterlidir. Sorgum aşağıdaki şekilde olmuştur:

SELECT * FROM urun WHERE urunadi LIKE '%ice%' COLLATE sql_latin1_general_cp1_ci_as

Sizde sorgunun sonuna gelecek karakter setleri listelemek için aşağıdaki sorguyu kullanabilirsiniz.

SELECT * FROM fn_helpcollations() WHERE name LIKE 'Turkish%' AND name LIKE '%CI%'

CI yerine CS yazarsanız Case Sensitive (büyük-küçük harf duyarlı) karakter setlerini listelemiş olursunuz. CI ise Case Insensitive (büyük-küçük harf duyarsız) olmaktadır.