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