创建扩展存储过程

适用于:SQL Server

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 CLR 集成。

扩展存储过程是具有原型的 C/C++ 函数:

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

使用前缀 xp_ 是可选的。 扩展存储过程名称在 Transact-SQL 语句中引用时区分大小写,而不考虑服务器上安装的代码页/排序顺序。 当您生成 DLL 时:

  • 如果入口点是必需的,则编写 DllMain 函数。

    此函数是可选的;如果您在源代码中未提供此函数,则编译器将链接其自己的版本,此时它仅返回 TRUE。 如果您提供了 DllMain 函数,当线程或进程附加到 DLL 或从 DLL 分离时,操作系统将调用此函数。

  • 必须导出从 DLL 外部调用的所有函数(所有扩展存储过程函数)。

    可以通过在 .def 文件的 EXPORT 节中列出函数名称来导出函数,也可以用 __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 部分之下导出此函数。

当 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\MSSQL13)。MSSQL标准版RVER\MSSQL\Binn\Sqlservr.exe)。 有关 sqlservr 参数的信息,请参阅 sqlservr 应用程序

另请参阅

srv_got_attention(扩展存储过程 API)