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


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

Важное примечаниеВажно!

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

Расширенная хранимая процедура является функцией с прототипом:

SRVRETCODE xp_extendedProcName**(**SRVPROC *);

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

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

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

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

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

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

Файл

Описание

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.

ПримечаниеПримечание

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

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

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