创建扩展存储过程

重要说明重要提示

后续版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。请改用 CLR 集成。

扩展存储过程是带有原型的函数:

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 部分之下导出此函数。

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