创建扩展存储过程

适用于: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 应用程序

另请参阅

srv_got_attention(扩展存储过程 API)