Приступая к работе с интеграцией со средой 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 и создайте новый запрос, соединившись с подходящей тестовой базой данных (например, к образцу базы данных AdventureWorks).
По умолчанию возможность выполнять код среды 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
-- 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
См. также
Основные понятия
Внутрипроцессные расширения SQL Server для ADO.NET