Начало работы с интеграцией 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;