• Web sitemizin içeriğine ve tüm hizmetlerimize erişim sağlamak için Web sitemize kayıt olmalı ya da giriş yapmalısınız. Web sitemize üye olmak tamamen ücretsizdir.
  • Sohbetokey.com ile canlı okey oynamaya ne dersin? Hem sohbet et, hem mobil okey oyna!
  • Soru mu? Sorun mu? ''Bir Sorum Var?'' sistemimiz aktiftir. Paylaşın beraber çözüm üretelim.

SQL Server CLR Entegrasyonu (Assembly Ekleme) Kullanımı

Üyelik Tarihi
24 Mar 2017
Konular
1,018
Mesajlar
2,425
MFC Puanı
4,910
Microsoft SQL Server'da geliştirme yaparken bilindiği üzere T-SQL dili kullanılmaktadır. T-SQL dili her ne kadar geliştirme yapmak için üstün yeteneklere sahip bir dil olsa bile bazı durumlarda veritabanı geliştirme konusunda ihtiyaçlarımızı karşılayamayabilmektedir. Bu gibi durumlarda Microsoft .Net kütüphaneleri kullanılarak geliştirilen Assembly'ler SQL Server'a CLR (Common Language Runtime) entegrasyonu ile eklenerek istenilen geliştirmeler yapılabilmektedir. Bu yazımızda Microsoft .Net kodları ile geliştirilen ve derlenen Assembly'lerin SQL Server'a nasıl import edileceği ile ilgili konulara örnek bir uygulama ile değineceğiz.
Günümüzde bazı işletmeler yapılan işlemlerin tarih ve saatlerini SQL Server tablolarında tutarken UTC (Universal Time Coordinated) formatında tutmaktadırlar. UTC , GMT (Greenwich Mean Time) ve CET (Central European Time) ile aynı anlama gelmektedir. SQL Server veritabanlarında UTC olarak tutulan bir zaman değerinin, dünyanın farklı bölgelerinden yapılacak olan sorgularda, sorgunun yapıldığı yerel bölgedeki Local Time değerine dönüştürülmesi istenebilir. Böyle bir senaryo ile karşılaşıldığında T-SQL dilinin built-in fonksiyonları akla gelebilir. DATEADD(), DATEDIFF() ve GETUTCDATE() gibi fonksiyonları iç içe kullanarak bir noktaya kadar çözüm geliştirilebilir. Ancak dünyada neredeyse bütün ülkelerde uygulanan “Yaz Saati Uygulaması” sebebiyle bu fonksiyonlardan dönecek olan değer tutarlı olmayacaktır. Örneğin ülkemizde Yaz Saati Uygulaması başlamadan UTC ile olan saat farkı +02:00 iken, Yaz Saati Uygulaması başladığında ise bu fark +03:00 olarak uygulanmaktadır. Peki hem Yaz Saati Uygulamasını dikkate alacak, hem de UTC ile olan saat farkını doğru olarak hesaplayacak hazır bir T-SQL fonksiyonu var mıdır? Heyecanlandığınızı biliyorum, ancak henüz SQL Server 2012 ile beraber böyle bir fonksiyon ne yazık ki bulunmamaktadır.
O zaman, SQL Server’da UTC Time olarak tutulan bir tarihin Local Time değerine çevrilmesi için ne yapılması gerekiyor? Bu makalemizde adım adım bu işlemi gerçekleştireceğiz.
Öncelikle bu işlemi gerçekleştirmek için SQL Server .NET CLR Integration yöntemini kullanarak SQL Server’da olmayan bir fonksiyonu C# kodu ile geliştirip SQL Server’a entegre edeceğiz ve böylelikle SQL Server özelliklerini CLR Integration ile extend etmiş olacağız. İsterseniz adım adım başlayalım:

  • CLR Integration Aktifleştirilmeli
C# kodu ile geliştireceğimiz bir fonksiyonun SQL Server tarafından kullanılabilmesi için, SQL Server CLR Integration özelliği aktif hale getirilmelidir. Bunun için aşağıdaki kodu çalıştırmamız gerekmektedir.

1USE master
2GO
3
4sp_configure 'clr enabled', 1
5GO
6
7RECONFIGURE
8GO


  • UTC Time Değrini Local Time Değerine Dönüştüren C# Kodu Yazılmalı
C# kodu ile fonksiyonumuzu oluşturacağımız için Visual Studio programını açıp yeni bir Class Library projesi açıyoruz.

b8dccca9-3e78-444d-963b-c14ed80936d8.PNG


Bir sonraki aşamada açılan sayfadaki kodların tamamını silip aşağıdaki kod bloğunu sayfamıza ekliyoruz:

01using System;
02
03using System.Data;
04
05using System.Data.SqlClient;
06
07using System.Data.SqlTypes;
08
09using Microsoft.SqlServer.Server;
10
11public partial class UserDefinedFunctions
12
13{
14
15[Microsoft.SqlServer.Server.SqlFunction]
16
17public static SqlDateTime ConvertToLocalTime(SqlDateTime utcTime)
18
19{
20
21if (utcTime.IsNull)
22
23return utcTime;
24
25else
26
27return new SqlDateTime(utcTime.Value.ToLocalTime());
28
29}
30
31};

Bu işlemden sonra ister F6 tuşuna basarak, istersek de BUILD menüsü altında bulunan “Build Solution” tıklayarak projeyi derliyoruz. Derleme işlemi tamamlandığında yazılan kodların yanında bulunan sarı renkli gösterge yeşil renge dönecektir.
f01000ee-e912-4cfa-b63d-98f05e45f9d7.PNG



  • Oluşturulan DLL Dosyası SQL Server’ın Kullanımına Alınır
C# ile yazılan, UTC zamanı Local zamana dönüştüren “ConvertToLocalTime” fonksiyonunu barındıran proje build edilerek derlendiğinde arka tarafta .dll uzantılı bir assembly oluşturulur. Bu dosyayı bulup SQL Server içerisindeki Assembly’lere eklenmelidir. Visual Studio ile açtığımız Class Library projesinin dosya yoluna gidilir. Kurulumdan kuruluma ve bilgisayar adına göre farklı olabileceği göz önüne alınmalıdır.



89c641e3-a56d-4ea8-9621-4467b6a5a448.PNG


Oluşturulan assembly SQL Server CLR Integration metodu ile kullanıma alınmış durumdadır.

  • UTC ile Local Time Arasında Dönüşüm Yapacak Olan Fonksiyon Eklenen Assembly’den Oluşturulur
Artık oluşturulan dll dosyası SQL Server kullanımına alındığı için, içerisinde bulunan ConvertToLocalTime() ismindeki fonksiyon create edilebilir. Bunun için assembly eklenen database altında aşağıdaki kod çalıştırılabilir;

1USE AdventureWorks2012
2GO
3
4CREATE FUNCTION ConvertToLocalTime
5(@UTCTime datetime)
6RETURNS DATETIME
7AS
8EXTERNAL NAME [UTCTimeConversion].[UserDefinedFunctions].[ConvertToLocalTime]

Bu işlemin ardından ilgili database altında (benim senaryom için AdventureWorks2012) ConvertToLocalTime() adında bir SQL CLR Integration Function oluşturulmuş olacaktır.
Oluşturduğumuz fonksiyon bir adet datetime veri tipinde parametre alacak ve aldığı bu değeri Yaz Saati Uygulamasını dikkate alarak yerel zamana çevirecektir.
Aşağıda oluşturulan fonksiyonun çalıştırılması test edilmiştir:

1USE AdventureWorks2012
2GO
3
4SELECT dbo.ConvertToLocalTime('20140322 00:00:00')
5SELECT dbo.ConvertToLocalTime('20120411 00:00:00')
6SELECT dbo.ConvertToLocalTime('20091029 00:00:00')

Elde edilen sonuçlar aşağıdaki gibidir:

c6102123-0f67-42aa-804e-81c46960e47e.PNG


Görüldüğü üzere ConvertToLocalTime() fonsiyonuna farklı değerler verilerek farklı yıllardaki Yaz Saati Uygulaması’nı da dikkate aldığını ve Yaz Saati Uygulamasının aktif olduğu aylarda +03:00, Yaz Saati Uygulamasının aktif olmadığı aylarda +02:00 saat eklendiği görülmektedir.
 
Üst