创建扩展存储过程
适用于:SQL Server
重要
后续版本的 Microsoft SQL Server 将删除该功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 CLR 集成。
扩展存储过程是具有原型的 C/C++ 函数:
SRVRETCODE xp_extendedProcName ** (**SRVPROC *) ;
使用前缀 xp_ 是可选的。 在 Transact-SQL 语句中引用扩展存储过程名称时区分大小写,而不考虑服务器上安装的代码页/排序顺序。 当您生成 DLL 时:
如果入口点是必需的,则编写 DllMain 函数。
此函数是可选的;如果您在源代码中未提供此函数,则编译器将链接其自己的版本,此时它仅返回 TRUE。 如果您提供了 DllMain 函数,当线程或进程附加到 DLL 或从 DLL 分离时,操作系统将调用此函数。
必须导出从 DLL 外部调用的所有函数(所有扩展存储过程函数)。
可以通过在 .def 文件的 EXPORTS 部分列出函数名称来导出此函数;也可以在源代码中在函数名称之前加上 __declspec(dllexport),这是一个 Microsoft 编译器扩展名(请注意,__declspec() 以两个下划线开头)。
创建扩展存储过程 DLL 时需要这些文件。
文件 | 说明 |
---|---|
Srv.h | 扩展存储过程 API 头文件 |
Opends60.lib | Opends60.dll 的导入库 |
若要创建扩展存储过程 DLL,请创建一个类型为动态链接库的项目。 有关创建 DLL 的详细信息,请参阅开发环境文档。
强烈建议所有扩展存储过程 DLL 都实现和导出以下函数:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
注意
__declspec(dllexport) 是 Microsoft 特定的编译器扩展名。 如果您的编译器不支持此指令,则应在 DEF 文件的 EXPORTS 部分之下导出此函数。
当使用跟踪标志 -T260 启动SQL Server时,或者如果具有系统管理员权限的用户运行 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\MSSQL13.MSSQLSERVER\MSSQL\Binn\Sqlservr.exe) 。 有关 sqlservr 参数的信息,请参阅 sqlservr 应用程序。