Поделиться через


Начало работы с интеграцией CLR

Область применения:SQL Server

В этой статье представлен обзор пространств имен и библиотек, необходимых для компиляции объектов базы данных с помощью интеграции SQL Server со средой выполнения CLR .NET Framework. В этой статье также показано, как писать, компилировать и запускать небольшую хранимую процедуру CLR, написанную на C# и Visual Basic .NET.

Обязательные пространства имен

Компоненты, необходимые для разработки базовых объектов базы данных CLR, устанавливаются с SQL Server. Функции интеграции CLR предоставляются в сборке, которая System.Data.dllявляется частью платформа .NET Framework. Эту сборку можно найти в глобальном кэше сборок (GAC) и в каталоге .NET Framework. Как правило, ссылка на эту сборку автоматически добавляется средствами командной строки и Visual Studio, поэтому ее не нужно добавлять вручную.

Сборка System.Data.dll содержит следующие пространства имен, необходимые для компиляции объектов базы данных CLR:

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

Совет

Загрузка объектов базы данных CLR в Linux поддерживается, но их необходимо построить с использованием среды выполнения .NET Framework (интеграция среды выполнения CLR SQL Server не поддерживает .NET Core или версии .NET 5 и более новые). Кроме того, сборки CLR с набором разрешений EXTERNAL_ACCESS или UNSAFE не поддерживаются на Linux.

Запись хранимой процедуры Hello World

Скопируйте и вставьте следующий код C# или Visual Basic .NET в текстовый редактор и сохраните его в файле с именем helloworld.cs или 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!";
    }
}

Эта программа содержит один статический метод в общедоступном классе. Этот метод использует два новых класса SqlContext и SqlPipe для создания объектов управляемой базы данных для вывода короткого текстового сообщения. Метод также назначает строку "Hello world!" в качестве значения out параметра. Этот метод можно объявить как хранимую процедуру в SQL Server, а затем выполнить так же, как хранимую процедуру Transact-SQL.

Скомпилируйте эту программу как библиотеку, загрузите ее в SQL Server и запустите ее в качестве хранимой процедуры.

Компиляция хранимой процедуры Hello World

SQL Server устанавливает файлы распространения платформа .NET Framework по умолчанию. К этим файлам относятся csc.exe и vbc.exe, компиляторы командной строки для программ C# и Visual Basic .NET. Чтобы скомпилировать наш пример, необходимо изменить переменную пути, чтобы указать на каталог, содержащий csc.exe или vbc.exe. Следующий путь — это путь установки по умолчанию платформа .NET Framework.

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

Версия содержит номер версии установленного платформа .NET Framework. Например:

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

После добавления каталога .NET Framework в путь можно скомпилировать пример хранимой процедуры в сборку с помощью следующей команды. Параметр /target позволяет скомпилировать код в виде сборки.

Для исходных файлов C#:

csc /target:library helloworld.cs

Для исходных файлов Visual Basic .NET:

vbc /target:library helloworld.vb

Эти команды запускают компилятор C# или Visual Basic .NET с помощью параметра /target, чтобы указать сборку библиотеки DLL.

Загрузка и запуск хранимой процедуры Hello World в SQL Server

После успешной компиляции примера процедуры его можно протестировать в SQL Server. Для этого откройте SQL Server Management Studio и создайте новый запрос, подключився к подходящей тестовой базе данных (например, AdventureWorks2022 пример базы данных).

Возможность выполнения кода среды CLR устанавливается OFF по умолчанию в SQL Server. Код СРЕДЫ CLR можно включить с помощью системной sp_configure хранимой процедуры. Дополнительные сведения см. в разделе Enable CLR integration.

Необходимо создать сборку, чтобы получить доступ к хранимой процедуре. В этом примере предполагается, что вы создали сборку helloworld.dll в каталоге C:\. Добавьте в запрос следующую инструкцию Transact-SQL.

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

После создания сборки теперь можно получить доступ к методу HelloWorld с помощью инструкции CREATE PROCEDURE. Мы называем хранимую процедуру hello:

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

Заметка

В предыдущем примере, если класс HelloWorldProc находится внутри пространства имен (называется MyNS), последняя строка в инструкции создания процедуры будет EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;.

После создания процедуры ее можно запустить так же, как обычную хранимую процедуру, написанную в Transact-SQL. Выполните следующую команду:

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

Ниже приведены ожидаемые выходные данные.

Hello world!
Hello world!

Удаление примера хранимой процедуры Hello World

После завершения выполнения примера хранимой процедуры можно удалить процедуру и сборку из тестовой базы данных.

Вначале удалите процедуру с помощью команды drop procedure.

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

После удаления процедуры можно удалить сборку, содержащую пример кода.

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