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


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

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

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

Начиная с 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!" в качестве значения параметра out. Этот метод можно объявить как хранимую процедуру в Transact-SQL хранимой процедуре.

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

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

Файлы распространения 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 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 с помощью инструкции create procedure. Мы вызовем хранимую процедуру "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
Расширения In-Process SQL Server для ADO.NET
Отладка объектов базы данных CLR
Безопасность интеграции со средой CLR