Aracılığıyla paylaş


CLR tümleştirmesi ile çalışmaya başlama

Şunlar için geçerlidir: SQL Server

Bu makalede, .NET Framework ortak dil çalışma zamanı (CLR) ile SQL Server tümleştirmesini kullanarak veritabanı nesnelerini derlemek için gereken ad alanları ve kitaplıklara genel bir bakış sağlanmaktadır. Makalede ayrıca C# ve Visual Basic .NET'te yazılmış küçük bir CLR saklı yordamını yazma, derleme ve çalıştırma işlemleri de gösterilir.

Gerekli ad alanları

Temel CLR veritabanı nesneleri geliştirmek için gereken bileşenler SQL Server ile yüklenir. CLR tümleştirme işlevselliği, .NET Framework'ün bir parçası olan System.Data.dlladlı bir derlemede kullanıma sunulur. Bu derleme Genel Derleme Önbelleği'nde (GAC) ve .NET Framework dizininde bulunabilir. Genellikle, bu derlemeye yapılan bir başvuru hem komut satırı araçları hem de Visual Studio tarafından otomatik olarak eklenir, bu nedenle el ile eklemeniz gerekmez.

System.Data.dll derlemesi, CLR veritabanı nesnelerini derlemek için gereken aşağıdaki ad alanlarını içerir:

  • System.Data
  • System.Data.Sql
  • Microsoft.SqlServer.Server
  • System.Data.SqlTypes

Bahşiş

Linux'ta CLR veritabanı nesnelerinin yüklenmesi desteklenir, ancak .NET Framework ile derlenmeleri gerekir (SQL Server CLR tümleştirmesi .NET Core veya .NET 5 ve sonraki sürümleri desteklemez). Ayrıca, EXTERNAL_ACCESS veya UNSAFE izin kümesine sahip CLR derlemeleri Linux'ta desteklenmez.

"Merhaba Dünya" saklı yordamı yazın

Aşağıdaki C# veya Visual Basic .NET kodunu kopyalayıp bir metin düzenleyicisine yapıştırın ve helloworld.cs veya helloworld.vbadlı bir dosyaya kaydedin.

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;

public class HelloWorldProc
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void HelloWorld(out string text)
    {
        SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);
        text = "Hello world!";
    }
}

Bu program, ortak bir sınıfta tek bir statik yöntem içerir. Bu yöntem, kısa bir metin iletisi çıktısı almak üzere yönetilen veritabanı nesneleri oluşturmak için SqlContext ve SqlPipeolmak üzere iki yeni sınıf kullanır. yöntemi ayrıca bir out parametresinin değeri olarak "Hello world!" dizesini atar. Bu yöntem SQL Server'da saklı yordam olarak bildirilebilir ve ardından Transact-SQL saklı yordamıyla aynı şekilde çalıştırılabilir.

Bu programı kitaplık olarak derleyin, SQL Server'a yükleyin ve saklı yordam olarak çalıştırın.

"Hello World" saklı yordamını derleme

SQL Server varsayılan olarak .NET Framework yeniden dağıtım dosyalarını yükler. Bu dosyalar csc.exe ve vbc.exe, C# ve Visual Basic .NET programları için komut satırı derleyicilerini içerir. Örneğimizi derlemek için yol değişkeninizi csc.exe veya vbc.exeiçeren dizine işaret eden şekilde değiştirmeniz gerekir. Aşağıdaki yol, .NET Framework'ün varsayılan yükleme yoludur.

C:\Windows\Microsoft.NET\Framework\(version)

Sürüm, yüklü .NET Framework'ün sürüm numarasını içerir. Mesela:

C:\Windows\Microsoft.NET\Framework\v4.8.0

.NET Framework dizinini yolunuza ekledikten sonra, aşağıdaki komutla örnek depolanmış yordamı bir derlemeye dönüştürebilirsiniz. /target seçeneği bunu bir derlemede derlemenize olanak tanır.

C# kaynak dosyaları için:

csc /target:library helloworld.cs

Visual Basic .NET kaynak dosyaları için:

vbc /target:library helloworld.vb

Bu komutlar, kitaplık DLL'si oluşturmayı belirtmek için /target seçeneğini kullanarak C# veya Visual Basic .NET derleyicisini başlatır.

SQL Server'da "Hello World" saklı yordamını yükleme ve çalıştırma

Örnek yordam başarıyla derlendiğinde SQL Server'da test edebilirsiniz. Bunu yapmak için SQL Server Management Studio'yu açın ve uygun bir test veritabanına (örneğin, AdventureWorks2022 örnek veritabanı) bağlanarak yeni bir sorgu oluşturun.

Ortak dil çalışma zamanı (CLR) kodu yürütme özelliği SQL Server'da varsayılan olarak OFF olarak ayarlanır. CLR kodu, sp_configure sistem saklı yordamı kullanılarak etkinleştirilebilir. Daha fazla bilgi için bkz. CLR tümleştirmesini etkinleştirme.

Saklı yordama erişebilmek için derlemeyi oluşturmamız gerekir. Bu örnekte, C:\ dizininde helloworld.dll derlemesini oluşturduğunuz varsayılır. Sorgunuza aşağıdaki Transact-SQL deyimini ekleyin.

CREATE ASSEMBLY helloworld from 'C:\helloworld.dll' WITH PERMISSION_SET = SAFE

Derleme oluşturulduktan sonra artık CREATE PROCEDURE deyimini kullanarak HelloWorld yöntemimize erişebiliriz. Saklı prosedürümüzü helloolarak adlandırıyoruz:

CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;

Not

Önceki örnekte, HelloWorldProc sınıfı bir ad alanı içindeyse (MyNSolarak adlandırılır), create yordam deyimindeki son satır EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;olacaktır.

Yordam oluşturulduktan sonra, Transact-SQL'de yazılmış normal bir saklı yordam gibi çalıştırılabilir. Aşağıdaki komutu yürütür:

DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;

İşte beklenen çıktı.

Hello world!
Hello world!

"Hello World" saklı yordam örneğini kaldırma

Örnek saklı yordamı çalıştırmayı bitirdiğinizde, yordamı ve derlemeyi test veritabanınızdan kaldırabilirsiniz.

İlk olarak, drop procedure komutunu kullanarak yordamı kaldırın.

IF EXISTS (SELECT name
           FROM sysobjects
           WHERE name = 'hello')
    DROP PROCEDURE hello;

Prosedür sonlandırıldıktan sonra, örnek kodunuzu içeren derlemeyi kaldırabilirsiniz.

IF EXISTS (SELECT name
           FROM sys.assemblies
           WHERE name = 'helloworld')
    DROP ASSEMBLY helloworld;