Создание расширенных хранимых процедур

Применимо к:SQL Server

Внимание

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

Расширенная хранимая процедура — это функция C/C++ с прототипом:

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

Указание префикса xp_ необязательно. Расширенные имена хранимых процедур зависят от регистра при ссылке на инструкции Transact-SQL независимо от порядка кодовой страницы или сортировки, установленного на сервере. При создании DLL-библиотеки нужно сделать следующее.

  • Если необходима точка входа, напишите функцию DllMain.

    Эта функция необязательна. Если ее нет в исходном коде, то компилятор компонует собственную версию, которая всего лишь возвращает значение TRUE. Если функция DllMain создана, то операционная система вызывает ее в тот момент, когда поток или процесс присоединяется к DLL-библиотеке или отсоединяется от нее.

  • Все функции, которые вызываются за пределами DLL-библиотеки (все расширенные хранимые процедуры и функции), должны быть экспортированы.

    Вы можете экспортировать функцию, указав ее имя в разделе EXPORTS файла .def или префикс имени функции в исходном коде с помощью __declspec(dllexport), расширения компилятора Майкрософт (обратите внимание, что __declspec() начинается с двух подчеркивания.

Для создания DLL-библиотеки расширенной хранимой процедуры необходимы следующие файлы.

Файл Description
Srv.h Файл заголовка API-интерфейса расширенных хранимых процедур
Opends60.lib Библиотека импорта для Opends60.dll

Чтобы создать DLL-библиотеку расширенной хранимой процедуры, создайте проект типа «Динамическая библиотека». Дополнительные сведения о создании DLL-библиотек см. в документации по среде разработки.

Настоятельно рекомендуется, чтобы все DLL-библиотеки расширенных хранимых процедур реализовали и экспортировали следующую функцию.

__declspec(dllexport) ULONG __GetXpVersion()  
{  
   return ODS_VERSION;  
}  

Примечание.

Объявление __declspec(dllexport) является расширением компилятора Майкрософт. Если компилятор не поддерживает эту директиву, то функцию необходимо экспортировать в DEF-файле в раздел EXPORTS.

При запуске SQL Server с флагом трассировки -T260 или если пользователь с правами системного администратора запускает DBCC TRACEON (260), а если библиотека DLL расширенной хранимой процедуры не поддерживает __GetXpVersion(), предупреждающее сообщение (ошибка 8131: расширенная библиотека DLL хранимой процедуры "%" не экспортирует __GetXpVersion().) выводится в журнал ошибок. (Обратите внимание, что __GetXpVersion() начинается с двух символов подчеркивания.)

Если DLL-библиотека расширенной хранимой процедуры экспортирует __GetXpVersion(), но версия, возвращенная этой функцией, меньше, чем требует сервер, то в журнал ошибок заносится предупредительное сообщение, содержащее версию, возвращенную функцией, и версию, ожидаемую сервером. Если вы получите это сообщение, возвращается неверное значение из __GetXpVersion() или выполняется компиляция с более старой версией srv.h.

Примечание.

SetErrorMode, функция Microsoft Win32, не должна вызываться в расширенных хранимых процедурах.

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

Чтобы выполнить отладку библиотеки DLL расширенной хранимой процедуры, скопируйте ее в каталог SQL Server\Binn. Чтобы указать исполняемый файл для сеанса отладки, введите путь и имя файла исполняемого файла Microsoft SQL Server (например, C:\Program Files\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\Binn\Sqlservr.exe). Сведения о аргументах sqlservr см. в приложении sqlservr.

См. также

srv_got_attention (API-интерфейс расширенных хранимых процедур)