Бөлісу құралы:


Добавление на SQL Server расширенной хранимой процедуры

Область применения: SQL Server

Внимание

Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Используйте вместо этого интеграцию со средой CLR.

Библиотека DLL, содержащая расширенные функции хранимой процедуры, выступает в качестве расширения для SQL Server. Чтобы установить библиотеку DLL, скопируйте файл в каталог, например файл, содержащий стандартные ФАЙЛЫ DLL SQL Server (C:\Program Files\Microsoft SQL Server\MSSQL12.0.x\MSSQL\Binn по умолчанию).

После копирования библиотеки DLL расширенной хранимой процедуры на сервер системный администратор SQL Server должен зарегистрировать в SQL Server каждую расширенную функцию хранимой процедуры в библиотеке DLL. Это выполняется с помощью системной хранимой процедуры sp_addextendedproc.

Внимание

Перед добавлением расширенной процедуры на сервер и предоставлением разрешения на ее выполнение другим пользователям системному администратору следует тщательно проверить расширенную хранимую процедуру, чтобы убедиться, что она не содержит вредоносного или злонамеренного кода. Проверяйте все данные, вводимые пользователем. Не осуществляйте объединение пользовательских входных данных до их проверки. Никогда не выполняйте команду, построенную на основании непроверенных пользовательских входных данных.

Первый параметр sp_addextendedproc указывает имя функции, а второй параметр указывает имя DLL-библиотеки, в которой размещается функция. Рекомендуется указывать полный путь DLL.

Внимание

Существующие библиотеки DLL, которые не зарегистрированы с полным путем, перестанут работать после обновления до SQL Server 2005 или более поздней версии. Для решения этой проблемы воспользуйтесь хранимой процедурой sp_dropextendedproc для отмены регистрации DLL-библиотеки, а затем выполните их повторную регистрацию процедурой sp_addextendedproc, указывая полный путь доступа.

Имя функции, передаваемое хранимой процедуре sp_addextendedproc, должно полностью совпадать с именем функции в DLL-библиотеке, включая регистр символов. Например, эта команда регистрирует функцию xp_hello, , расположенную в библиотеке DLL с именем xp_hello.dll, как расширенная хранимая процедура SQL Server:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';  

Если имя функции, указанной в sp_addextendedproc не совсем совпадает с именем функции в библиотеке DLL, новое имя будет зарегистрировано в SQL Server, но имя не будет использоваться. Например, хотя xp_Hello он зарегистрирован как расширенная хранимая процедура SQL Server, расположенная в xp_hello.dll, SQL Server не сможет найти функцию в библиотеке DLL, если вы используете xp_Hello для вызова функции позже.

--Register the function (xp_hello) with an initial upper case  
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll';  
  
--Use the newly registered name to call the function  
DECLARE @txt varchar(33);  
EXEC xp_Hello @txt OUTPUT;  
  
--This is the error message  
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1  
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).  

Если имя функции, указанной в sp_addextendedproc точности имя функции в библиотеке DLL, и параметры сортировки экземпляра SQL Server не учитывает регистр, пользователь может вызывать расширенную хранимую процедуру, используя любое сочетание букв нижнего и верхнего регистра имени.

--Register the function (xp_hello)  
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';  
  
--The following will succeed in calling xp_hello  
DECLARE @txt varchar(33);  
EXEC xp_Hello @txt OUTPUT;  
  
DECLARE @txt varchar(33);  
EXEC xp_HelLO @txt OUTPUT;  
  
DECLARE @txt varchar(33);  
EXEC xp_HELLO @txt OUTPUT;  

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

--Register the function (xp_hello)  
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';  
  
--The following will result in an error  
DECLARE @txt varchar(33);  
EXEC xp_HELLO @txt OUTPUT;  
  
--This is the error  
Server: Msg 2812, Level 16, State 62, Line 1  

Не нужно останавливать и перезапускать SQL Server.

См. также

sp_addextendedproc (Transact-SQL)
sp_dropextendedproc (Transact-SQL)