Merhaba Arakadaşlar,
Bu yazımda Common Language runtime ile Sql server üzerine C# ‘ hazırladığınız bir fonksiyonu eklemeye anlatacağım. Öncelikle Spliti seçtim çünki Sql üzerinde split yapamıyoruz. bunun çözümüde yine SQL 2005 ile .Net Framework üzerinde geliştirdiğimiz DLL lerin Sql üzerine eklenip functionların oluşturulması ile çözebiliriz.
Common Language Runtime SQL 2005 ile gelen bir yenilik. Yaptığı işlem ise süper !!!. C# ile hazırladığınız bir DLL i SQL üzerinde tanımlı USER DEFINED FUNCTION olarak kullanabilirsiniz. Nasıl mı ?
Öncelikle VS üzerinde yeni bir proje oluşturark başlayalım işe. VS 2008 imizi açıyoruz ve projelerden Database ‘ i seçiyoruz.
Daha sonra eklenen proje üzerinde sağ tıklayıp, Add > New Item > User Defined Function>Split ismini verelim.
using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[SqlFunction(TableDefinition = "ID int", FillRowMethodName = "FillRow")] //Tablomuz daki columnları buradan belirtebiliriz. split olacağı için sadece tek column var.
public static IEnumerable SplitToTable(SqlString pValue, SqlString pAyirac)
{
// IEnumerable kayıtların tablo halinde gösterilmesi için
// value olarak aldığımız değer bizim hangi split edeceğimiz veriyi içeriyor
string value = pValue.ToString();
//Ayırac olarak gelen ise gelen veriyi neye göre ayıracağımızı içeriyor.
char ayirac = Convert.ToChar(pAyirac.ToString());
DataTable dt = new DataTable();
dt.Columns.Add(“ID”);
string[] yeniDegerler = value.Split(ayirac);
foreach (string deger in yeniDegerler)
{
if (!string.IsNullOrEmpty(deger))
{
//Tüm değerleri datatable üzerine ekleyeyim
DataRow drNew = dt.NewRow();
drNew["ID"] = deger;
dt.Rows.Add(drNew);
}
}
//tablodaki rowlar bir IEnumerable tip olarak dönderilebilir.
return dt.Rows;
}
public static void FillRow(object item, out int pId)
{
//rowlarımız enumeration olarak tanımlayacak methodumuz. Bu methodu function çağrılırken tanımlamış olmamız gerekiyor.
DataRow row = (DataRow)item;
pId = Convert.ToInt32(row[0]);
}
};
Eğer projenizi eklerken sizden kullanmak için bir bağlantı istedi ise, ve siz bu bağlantıyı referans olarak ekledi iseniz, vs üzerinde F5 ile direk çalıştırdğınız seçtiniz projeye functionımızı deploy edecektir.
Eğer TSQL ile yapmak isterseniz, projemizi build ettikten sonra bin klasöründe bulunan dll imizi c:\ altına kopyalayalım, sonra Sql serverımızı açıp hangi DB üzerinde kullanacak isek ona ait bir query penceresi açalım, ve dll imi aşağıdaki gibi Sql üzerine ekleyelim,
CREATE ASSEMBLY Split FROM ‘C:\Split.dll’
GO
USE [pubs]
GO
CREATE FUNCTION [dbo].[SplitToTable](@pValue [nvarchar](4000), @pAyirac [nvarchar](4000))
RETURNS TABLE (
[ID] [int] NULL
) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Split].[UserDefinedFunctions].[SplitToTable]
GO
daha sonra basit bir query ile test edelim.
SELECT * FROM dbo.SplitToTable(’2,2,2,2,2,2,2′,’,')
Sonuç ;
ID
———–
2
2
2
2
2
2
2
(7 row(s) affected)
Bol Kod Günler