Bagikan melalui


Mulai menggunakan integrasi CLR

Berlaku untuk:SQL Server

Artikel ini memberikan gambaran umum tentang namespace dan pustaka yang diperlukan untuk mengkompilasi objek database menggunakan integrasi SQL Server dengan runtime bahasa umum .NET Framework (CLR). Artikel ini juga menunjukkan kepada Anda cara menulis, mengkompilasi, dan menjalankan prosedur tersimpan CLR kecil yang ditulis dalam C# dan Visual Basic .NET.

Namespace yang diperlukan

Komponen yang diperlukan untuk mengembangkan objek database CLR dasar diinstal dengan SQL Server. Fungsionalitas integrasi CLR diekspos dalam rakitan yang disebut System.Data.dll, yang merupakan bagian dari .NET Framework. Rakitan ini dapat ditemukan di Global Assembly Cache (GAC) dan di direktori .NET Framework. Biasanya, referensi ke rakitan ini secara otomatis ditambahkan oleh alat baris perintah dan Visual Studio, sehingga tidak perlu menambahkannya secara manual.

Rakitan System.Data.dll berisi namespace berikut, yang diperlukan untuk mengkompilasi objek database CLR:

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

Tip

Memuat objek database CLR di Linux didukung, tetapi harus dibangun dengan .NET Framework (integrasi CLR SQL Server tidak mendukung .NET Core, atau .NET 5 dan versi yang lebih baru). Selain itu, rakitan CLR dengan EXTERNAL_ACCESS atau set izin UNSAFE tidak didukung di Linux.

Menulis prosedur tersimpan "Halo Dunia"

Salin dan tempel kode C# atau Visual Basic .NET berikut ke editor teks, dan simpan dalam file bernama helloworld.cs atau helloworld.vb.

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!";
    }
}

Program ini berisi satu metode statis pada kelas publik. Metode ini menggunakan dua kelas baru, SqlContext dan SqlPipe, untuk membuat objek database terkelola untuk menghasilkan pesan teks singkat. Metode ini juga menetapkan string "Halo dunia!" sebagai nilai out parameter. Metode ini dapat dinyatakan sebagai prosedur tersimpan di SQL Server, dan kemudian berjalan dengan cara yang sama seperti prosedur tersimpan Transact-SQL.

Kompilasi program ini sebagai pustaka, muat ke SQL Server, dan jalankan sebagai prosedur tersimpan.

Mengkompilasi prosedur tersimpan "Halo Dunia"

SQL Server menginstal file redistribusi .NET Framework secara default. File-file ini termasuk csc.exe dan vbc.exe, pengkompilasi baris perintah untuk program C# dan Visual Basic .NET. Untuk mengkompilasi sampel kami, Anda harus memodifikasi variabel jalur Anda untuk menunjuk ke direktori yang berisi csc.exe atau vbc.exe. Jalur berikut adalah jalur penginstalan default .NET Framework.

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

Versi berisi nomor versi .NET Framework yang diinstal. Contohnya:

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

Setelah menambahkan direktori .NET Framework ke jalur, Anda dapat mengkompilasi sampel prosedur tersimpan ke dalam rakitan dengan perintah berikut. Opsi ini /target memungkinkan Anda untuk mengkompilasinya ke dalam rakitan.

Untuk file sumber C#:

csc /target:library helloworld.cs

Untuk file sumber Visual Basic .NET:

vbc /target:library helloworld.vb

Perintah ini meluncurkan pengkompilasi C# atau Visual Basic .NET menggunakan opsi /target untuk menentukan pembangunan pustaka DLL.

Muat dan jalankan prosedur tersimpan "Halo Dunia" di SQL Server

Setelah prosedur sampel berhasil dikompilasi, Anda dapat mengujinya di SQL Server. Untuk melakukan ini, buka SQL Server Management Studio dan buat kueri baru, sambungkan ke database pengujian yang sesuai (misalnya, AdventureWorks2025 database sampel).

Kemampuan untuk menjalankan kode runtime bahasa umum (CLR) diatur ke OFF secara default di SQL Server. Kode CLR dapat diaktifkan dengan menggunakan prosedur tersimpan sp_configure sistem. Untuk informasi selengkapnya, lihat Mengaktifkan integrasi CLR.

Kita perlu membuat assembly sehingga kita dapat mengakses prosedur tersimpan. Untuk contoh ini, kami berasumsi bahwa Anda membuat rakitan helloworld.dll di direktori C:\. Tambahkan pernyataan Transact-SQL berikut ke kueri Anda.

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

Setelah perakitan dibuat, kita sekarang dapat mengakses metode HelloWorld kita dengan menggunakan perintah CREATE PROCEDURE. Kami memanggil prosedur tersimpan kami hello:

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

Nota

Dalam contoh sebelumnya, jika kelas HelloWorldProc berada di dalam namespace (disebut MyNS), baris terakhir dalam pernyataan prosedur pembuatan akan menjadi EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;.

Setelah prosedur dibuat, prosedur dapat dijalankan seperti prosedur tersimpan normal yang ditulis dalam Transact-SQL. Jalankan perintah berikut:

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

Berikut adalah output yang diharapkan.

Hello world!
Hello world!

Menghapus sampel prosedur tersimpan "Halo Dunia"

Setelah selesai menjalankan sampel prosedur tersimpan, Anda dapat menghapus prosedur dan perakitan dari database pengujian Anda.

Pertama, hapus prosedur menggunakan perintah drop procedure.

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

Setelah prosedur dihilangkan, Anda dapat menghapus rakitan yang berisi kode sampel Anda.

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