Приступая к работе с интеграцией со средой CLR

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

Необходимые пространства имен

Начиная с версии SQL Server 2005, компоненты, необходимые для разработки основных объектов базы данных 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

Создание простой хранимой процедуры «Hello World»

Скопируйте и вставьте следующий код Visual C# или Microsoft 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!";
    }
}
Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.Runtime.InteropServices
 
Public Class HelloWorldProc
    <Microsoft.SqlServer.Server.SqlProcedure> _ 
    Public Shared  Sub HelloWorld(<Out()> ByRef text as String)
        SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)
        text = "Hello world!"
    End Sub
End Class

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

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

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

В SQL Server распространяемые файлы Microsoft .NET Framework устанавливаются по умолчанию. Эти файлы включают csc.exe и vbc.exe, компиляторы командной строки для программ Visual C# и Visual Basic. Чтобы скомпилировать приведенный образец, измените используемую системную переменную пути и укажите в ней путь к каталогу, содержащему файл csc.exe или vbc.exe. Ниже приведен используемый по умолчанию путь установки .NET Framework.

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

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

C:\Windows\Microsoft.NET\Framework\v2.0.31113

После добавления каталога .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 и создайте новый запрос, подключившись к подходящей тестовой базе данных (например, к образцу базы данных База данных AdventureWorks2008R2).

По умолчанию возможность выполнять код среды CLR в SQL Server отключена. Код CLR можно включить запуском системной хранимой процедуры sp_configure. Дополнительные сведения см. в разделе Включение интеграции со средой CLR.

Создание сборки требуется для того, чтобы можно было получить доступ к хранимой процедуре. В этом примере предполагается, что была создана сборка 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

После создания процедуры ее можно выполнить как обычную хранимую процедуру на языке 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