Создание расширенных хранимых процедур
Важно! |
---|
В будущей версии 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.