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


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

Применимо к:SQL Server

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

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

Компоненты, необходимые для разработки базовых объектов базы данных CLR, устанавливаются с SQL Server. Функции интеграции CLR предоставляются в сборке, которая System.Data.dllявляется частью .NET Framework. Эту сборку можно найти в глобальном кэше сборок (GAC), а также в каталоге .NET Framework. Ссылка на эту сборку обычно добавляется автоматически средствами командной строки и Microsoft 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_ACCESSUNSAFE разрешений не поддерживаются в Linux.

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

Скопируйте и вставьте следующий код Visual C# или Visual Basic в текстовый редактор и сохраните его в файле с именем 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.exevbc.exeи компиляторы командной строки для программ Visual C# и Visual Basic. Чтобы скомпилировать наш пример, необходимо изменить переменную пути, чтобы указать на каталог, содержащий 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 позволяет скомпилировать код в виде сборки.

Для файлов с исходным кодом на языке Visual C#:

csc /target:library helloworld.cs

Для файлов с исходным кодом на языке Visual Basic:

vbc /target:library helloworld.vb

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

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

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

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

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

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

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

CREATE PROCEDURE hello
@i nchar(25) OUTPUT
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;
-- if the HelloWorldProc class is inside a namespace (called MyNS),
-- the last line in the create procedure statement would be
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld

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

DECLARE @J NCHAR(25);
EXEC hello @J out;
PRINT @J;

Это приведет к следующим выходным данным в окне сообщений SQL Server Management Studio.

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;

Далее

Дополнительные сведения об интеграции СРЕДЫ CLR в SQL Server см. в следующих статьях: