Agregar un procedimiento almacenado extendido a SQL Server

Nota importanteImportante

Esta característica se quitará en una versión futura de Microsoft SQL Server. No utilice esta característica en nuevos trabajos de desarrollo y modifique lo antes posible las aplicaciones que actualmente la utilizan. En su lugar, utilice la integración CLR.

Un archivo DLL que contiene funciones de procedimiento almacenado extendido actúa como una extensión de MicrosoftSQL Server. Para instalar el archivo DLL, cópielo en un directorio como, por ejemplo, el directorio que contiene los archivos DLL estándar de SQL Server (de forma predeterminada, C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\Binn).

Una vez que haya copiado en el servidor el archivo DLL de procedimiento almacenado extendido, un administrador del sistema de SQL Server debe registrar en SQL Server cada una de las funciones de procedimiento almacenado extendido del archivo DLL. Para ello, debe utilizarse el procedimiento almacenado del sistema sp_addextendedproc.

Nota de seguridadNota de seguridad

Antes de agregar el procedimiento almacenado extendido al servidor y otorgar permisos de ejecución a otros usuarios, el administrador del sistema debe revisarlo por completo para asegurarse de que no contanga código perjudicial o dañino. Valide toda entrada de usuario. No concatene ninguna entrada de usuario antes de validarla. No ejecute nunca un comando creado a partir de una entrada de usuario no validada. Para obtener más información sobre la forma de validar la entrada, vea Inyección de código SQL.

El primer parámetro de sp_addextendedproc especifica el nombre de la función y el segundo parámetro especifica el nombre del archivo DLL donde reside dicha función. Se recomienda especificar la ruta de acceso completa del archivo DLL.

Nota importanteImportante

Los archivos DLL existentes que no se hayan registrado con una ruta de acceso completa no funcionarán tras una actualización a SQL Server 2005. Para corregir el problema, utilice sp_dropextendedproc a fin de eliminar el archivo DLL del registro y, a continuación, vuelva a registrarlo con sp_addextendedproc, especificando la ruta de acceso completa.

El nombre de la función especificada en sp_addextendedproc debe ser exactamente el mismo que el nombre de la función del archivo DLL, incluidas las mayúsculas y minúsculas. Por ejemplo, este comando registra una función xp_hello, situada en un archivo dll denominado xp_hello.dll, como un procedimiento almacenado extendido de SQL Server:

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

Si el nombre de la función especificada en sp_addextendedproc no coincide exactamente con el nombre de función del archivo DLL, el nuevo nombre se registrará en SQL Server, pero no podrá utilizarse. Por ejemplo, aunque xp_Hello se registre como un procedimiento almacenado extendido de SQL Server incluido en xp_hello.dll, SQL Server no podrá buscar la función en el archivo DLL si usa xp_Hello para llamar posteriormente a la función.

--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.).

Si el nombre de la función especificada en sp_addextendedproc coincide exactamente con el nombre de función del archivo DLL y la intercalación de la instancia de SQL Server no distingue mayúsculas de minúsculas, el usuario puede llamar al procedimiento almacenado extendido utilizando cualquier combinación de letras mayúsculas y minúsculas en el nombre.

--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

Cuando la intercalación de la instancia de SQL Server distinga mayúsculas de minúsculas, SQL Server no podrá llamar al procedimiento almacenado extendido (aunque se haya registrado exactamente con el mismo nombre e intercalación que la función del archivo DLL) si se llama al procedimiento con distintas letras mayúsculas y minúsculas.

--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

No es necesario detener y reiniciar SQL Server.