创建扩展存储过程
适用于: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。MSSQLSERVER\MSSQL\Binn\Sqlservr.exe)。 有关 sqlservr 参数的信息,请参阅 sqlservr 应用程序。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈