Crear procedimientos almacenados extendidos

Se aplica a:SQL Server

Importante

Esta característica se quitará en una versión futura de SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. En su lugar, use la integración con CLR.

Un procedimiento almacenado extendido es una función de C/C++ con un prototipo:

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

El uso del prefijo xp_ es opcional. Los nombres de procedimientos almacenados extendidos distinguen mayúsculas de minúsculas cuando se hace referencia en instrucciones Transact-SQL, independientemente del criterio de ordenación o página de códigos instalado en el servidor. Cuando genere un archivo DLL:

  • Si se necesita un punto de entrada, escriba una función DllMain.

    Esta función es opcional; si no se proporciona en código fuente, el compilador vincula su propia versión, que solo devuelve TRUE. Si se proporciona una función DllMain, el sistema operativo llama a esta función cuando se adjunta o se separa un proceso o subproceso en el archivo DLL.

  • Deben exportarse todas las funciones a las que se llama desde el exterior del archivo DLL (todas las funciones Efunction de procedimiento almacenado extendido).

    Puede exportar una función enumerando su nombre en la sección EXPORTS de un archivo .def, o bien puede prefijar el nombre de función en el código fuente con __declspec(dllexport), una extensión del compilador de Microsoft (tenga en cuenta que __declspec() comienza con dos caracteres de subrayado).

Estos archivos son necesarios para crear un archivo DLL de procedimientos almacenados extendidos.

Archivo Descripción
Srv.h Archivo de encabezado de la API Procedimiento almacenado extendido
Opends60.lib Biblioteca de importación de Opends60.dll

Para crear un archivo DLL de procedimientos almacenados extendidos, cree un proyecto de tipo biblioteca de vínculos dinámicos. Para obtener más información sobre la forma de crear un archivo DLL, vea la documentación del entorno de desarrollo.

Se recomienda encarecidamente que todos los archivos DLL de procedimientos almacenados extendidos implementen y exporten la siguiente función:

__declspec(dllexport) ULONG __GetXpVersion()  
{  
   return ODS_VERSION;  
}  

Nota:

__declspec(dllexport) es una extensión de compilador específica de Microsoft. Si el compilador no admite esta directiva, debe exportar esta función en el archivo DEF, bajo la sección EXPORTS.

Cuando SQL Server se inicia con la marca de seguimiento -T260 o si un usuario con privilegios de administrador del sistema ejecuta DBCC TRACEON (260) y si el archivo DLL de procedimiento almacenado extendido no admite __GetXpVersion(), un mensaje de advertencia (error 8131: dll de procedimiento almacenado extendido '%' no exporta __GetXpVersion().) se imprime en el registro de errores. (Tenga en cuenta que __GetXpVersion() comienza con dos caracteres de subrayado).

Si el archivo DLL de procedimientos almacenados extendidos exporta __GetXpVersion() pero la versión devuelta por la función es menor que la que requiere el servidor, en el registro de errores se imprime un mensaje de advertencia que indica la versión devuelta por la función y la versión esperada por el servidor. Si recibe este mensaje, va a devolver un valor incorrecto de __GetXpVersion() o está compilando con una versión anterior de srv.h.

Nota:

SetErrorMode, una función De Microsoft Win32, no debe llamarse en procedimientos almacenados extendidos.

Se recomienda que un procedimiento almacenado extendido de ejecución prolongada llame periódicamente a srv_got_attention para que el procedimiento pueda finalizarse si se elimina la conexión o se anula el lote.

Para depurar un archivo DLL de procedimiento almacenado extendido, cópielo en el directorio SQL Server\Binn. Para especificar el archivo ejecutable para la sesión de depuración, escriba la ruta de acceso y el nombre de archivo del archivo ejecutable de Microsoft SQL Server (por ejemplo, C:\Archivos de programa\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\Binn\Sqlservr.exe). Para obtener información sobre los argumentos sqlservr, vea sqlservr Application.

Consulte también

srv_got_attention (API de procedimiento almacenado extendido)