将扩展存储过程添加到 SQL Server

重要说明重要提示

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

包含扩展存储过程函数的 DLL 充当对 MicrosoftSQL Server 的扩展。若要安装此 DLL,请将文件复制到一个目录中,比如包含标准 SQL Server DLL 文件的目录(默认情况下是 C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\Binn)。

在将扩展存储过程 DLL 复制到服务器之后,SQL Server 系统管理员必须将 DLL 中的每个扩展存储过程函数注册到 SQL Server。可以使用 sp_addextendedproc 系统存储过程完成该操作。

安全说明安全说明

在将扩展存储过程添加到服务器并将执行权限授予其他用户之前,系统管理员应当对它进行彻底检查,确保它不包含有害或恶意的代码。验证所有用户的输入。验证之前,不要串联用户输入。绝对不要执行根据尚未验证的用户输入构造的命令。有关验证输入的详细信息,请参阅 SQL 注入

sp_addextendedproc 的第一个参数指定函数的名称,第二个参数指定包含该函数的 DLL 的名称。建议指定 DLL 的完整路径。

重要说明重要提示

未以完整路径注册的现有 DLL 在升级到 SQL Server 2005 之后将无法工作。要纠正该问题,请使用 sp_dropextendedproc 取消 DLL 的注册,然后使用 sp_addextendedproc 并通过指定 DLL 的完整路径来重新进行注册。

sp_addextendedproc 中指定的函数名称必须与 DLL 中的函数名称完全相同,包括大小写。例如,该命令将函数 xp_hello(位于名为 xp_hello.dll 的 DLL 中)注册为 SQL Server 扩展存储过程:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\xp_hello.dll'

如果在 sp_addextendedproc 中指定的函数名称与 DLL 中的函数名称不完全匹配,则新名称将在 SQL Server 中注册,但该名称是不可使用的。例如,尽管将 xp_Hello 注册为位于 xp_hello.dll 中的 SQL Server 扩展存储过程,但如果随后使用 xp_Hello 调用该函数,则 SQL Server 将无法在 DLL 中找到该函数。

--Register the function (xp_hello) with an initial upper case
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll'

--Use the newly registered name to call the function
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

--This is the error message
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).

如果在 sp_addextendedproc 中指定的函数名称与 DLL 中的函数名称完全匹配,并且 SQL Server 实例的排序规则是不区分大小写的,则用户可以使用该名称的小写和大写字母的任意组合来调用此扩展存储过程。

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will succeed in calling xp_hello
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HelLO @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

如果 SQL Server 实例的排序规则是区分大小写的,那么,如果用不同的大小写形式调用此扩展存储过程,即使它是以与 DLL 中的函数完全相同的名称和排序规则注册的,SQL Server 仍将无法调用该过程。

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will result in an error
DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

--This is the error
Server: Msg 2812, Level 16, State 62, Line 1

不需要停止和重新启动 SQL Server。