Hüseyin Çelik Blog Sayfasi

.Net, Java, Android, Progress 4gl Paylasimlarim

Sql Server ASSEMBLY Kullanimi

Bazen T-SQL gücünün yetersiz kaldigi durumlarla karsilasabilirsiniz. Bu durumlari assembly kullanarak asabilirsiniz.

Öncelikle T-SQL neden yetmiyor?

Benim karsilastigim durumlar söyle;

Bir baska servera baglanarak bilgi almam ve islemler yapmam gereken bir durum olmustu. Sadece bilgi okumak hatta hedef servera veri yazmayi da link serverla yapabiliriz.

Bir diger durum ise;

 ini dosyasi okumam gerekti. Sizin ihtiyaciniz olabilir. Yerine göre link server isinizi görebilir. 

Öncelikle bir dll projesi olusturuyoruz.

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test.Util
{
    public static class SayacUtil
    {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static int Oku(int ambTurId, int sayac)
        {
            int say = sayac;
            string line;
            List<string> arrLine = new List<string>();
            string fileName = @"C:\test\Config.ini";
            if (File.Exists(fileName))
            {
                using (StreamReader reader = new StreamReader(fileName, Encoding.GetEncoding(1252)))
                {
                    while ((line = reader.ReadLine()) != null)
                    {
                        arrLine.Add(line);
                    }
                    reader.Close();
                }

                using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Write, FileShare.Write))
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        foreach (string l in arrLine)
                        {
                            if (l.IndexOf("=") != -1)
                            {
                                string[] arrini = l.Split('=');
                                if (arrini != null && arrini.Length > 0)
                                {
                                    if (Convert.ToInt32(arrini[0].Trim()) == ambTurId)
                                    {
                                        say = Convert.ToInt32(arrini[1].Trim()) + 1;
                                        writer.WriteLine(string.Format("{0}={1}", ambTurId.ToString(), say));
                                        continue;
                                    }
                                }
                            }
                            writer.WriteLine(l);
                        }
                    }
                }
            }
            return say;
        }

        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void Yaz(int ambTurId, int sayac)
        {
        }
    }
}

Çalisan kod bu sekilde dosya adi ve yolu degistirildi, siz kendinize göre ayarlayin.

Simdi Sql tarafindaki islemleri yapiyoruz.

CREATE ASYMMETRIC KEY CLR_SP_Key

FROM EXECUTABLE FILE = 'C:\test\TestSql.dll'

CREATE LOGIN CLR_SP_Login FROM ASYMMETRIC KEY CLR_SP_Key

GRANT EXTERNAL ACCESS ASSEMBLY TO CLR_SP_Login

CREATE USER CLR_SP_Login FOR LOGIN CLR_SP_Login

ALTER DATABASE test_sayac set TRUSTWORTHY ON 

Son olarak prosedürü olusturuyoruz.

CREATE ASSEMBLY CLR_SP FROM 'C:\test\TestSql.dll' WITH PERMISSION_SET=EXTERNAL_ACCESS

CREATE function dbo.Proc_CLR_SP (@ambTurId int, @sayac int) AS EXTERNAL NAME [CLR_SP].[TestSql.SayacUtil].[Oku] RETURNs int
--[Assembly Name].[Class Name].[Method Name]

CREATE FUNCTION [SayacOku] (@a int, @b int)
    RETURNS INT 
    AS EXTERNAL NAME [CLR_SP].[TestSql.SayacUtil].[Oku]


select dbo.SayacOku (8,1)

Umarim faydali olur, basarilar.

Loading