Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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. Utiliza la integración CLR en su lugar.
Cómo funcionan los procedimientos almacenados extendidos
El proceso por el cual funciona un procedimiento almacenado extendido es:
Cuando un cliente ejecuta un procedimiento almacenado extendido, la solicitud se transmite en formato de flujo de datos tabular (TDS) o Protocolo de Acceso a Objetos Simples (SOAP) desde la aplicación cliente a SQL Server.
SQL Server busca la DLL asociada al procedimiento almacenado extendido y carga la DLL si aún no está cargada.
SQL Server llama al procedimiento almacenado extendido solicitado (implementado como una función dentro de la DLL).
El procedimiento almacenado extendido pasa los conjuntos de resultados y parámetros de retorno al servidor mediante la API de Procedimientos Almacenados Extendidos.
En el pasado, los Servicios de Datos Abiertos se usaban para escribir aplicaciones servidor, como pasarelas a entornos de bases de datos no SQL Server. SQL Server no soporta las partes obsoletas de la API de Servicios de Datos Abiertos. La única parte de la API original de Open Data Services que aún soporta SQL Server son las funciones de procedimientos almacenados extendidos, por lo que la API fue renombrada como API de Procedimientos Almacenados Extendidos.
Con la aparición de consultas distribuidas e integración con CLR, la necesidad de aplicaciones API de Procedimientos Almacenados Extendidos ha sido en gran medida reemplazada.
Si ya tienes aplicaciones de pasarela, no puedes usar las opends60.dll que vienen con SQL Server para ejecutar las aplicaciones. Las aplicaciones de pasarela ya no son compatibles.
Procedimientos almacenados extendidos vs. integración CLR
La integración CLR ofrece una alternativa más robusta a la escritura de lógica del lado del servidor que era difícil de expresar o imposible de escribir en Transact-SQL. En versiones anteriores de SQL Server, los procedimientos almacenados extendidos (XP) proporcionaban el único mecanismo disponible para que los desarrolladores de aplicaciones de bases de datos escribieran dicho código.
Con la integración de CLR, la lógica que antes se escribía en forma de procedimientos almacenados suele expresarse mejor como funciones de valor en tabla, que permiten consultar los resultados construidos por la función en SELECT sentencias incrustándolos en la FROM cláusula.
Para más información, véase resumen de integración de CLR.
Características de ejecución de procedimientos almacenados extendidos
La ejecución de un procedimiento almacenado extendido tiene estas características:
La función de procedimiento almacenado extendido se ejecuta bajo el contexto de seguridad de SQL Server.
La función de procedimiento almacenado extendido se ejecuta en el espacio de procesos de SQL Server.
El hilo asociado a la ejecución del procedimiento almacenado extendido es el mismo que se usa para la conexión cliente.
Importante
Antes de añadir procedimientos almacenados extendidos al servidor y conceder permisos de ejecución a otros usuarios, el administrador del sistema debe revisar minuciosamente cada procedimiento almacenado extendido para asegurarse de que no contiene código dañino o malicioso.
Después de cargar la DLL de procedimiento almacenado extendido, la DLL permanece cargada en el espacio de direcciones del servidor hasta que SQL Server se detiene o el administrador descarga explícitamente la DLL usando DBCC <DLL_name> (FREE).
El procedimiento almacenado extendido puede ejecutarse desde Transact-SQL como procedimiento almacenado usando la EXECUTE sentencia:
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Parámetros
@ Retval
Un valor de devolución.
@ param1
Parámetro de entrada.
@ param2
Un parámetro de entrada/salida.
Precaución
Los procedimientos almacenados extendidos ofrecen mejoras de rendimiento y extienden la funcionalidad de SQL Server. Sin embargo, dado que la DLL de procedimientos almacenados extendidos y SQL Server comparten el mismo espacio de direcciones, un procedimiento problemático puede afectar negativamente al funcionamiento de SQL Server. Aunque las excepciones que plantea la DLL de procedimientos almacenados extendidos son gestionadas por SQL Server, es posible dañar áreas de datos de SQL Server. Como medida de seguridad, solo los administradores de sistemas SQL Server pueden añadir procedimientos almacenados extendidos a SQL Server. Estos procedimientos deben ser probados a fondo antes de instalarse.
Envía conjuntos de resultados al servidor con la API de Procedimientos Almacenados Extendidos
Al enviar un conjunto de resultados a SQL Server, el procedimiento almacenado extendido debe llamar a la API correspondiente de la siguiente manera:
La
srv_sendmsgfunción podría llamarse en cualquier orden antes o después de que todas las filas (si las hay) estén consrv_sendrow. Todos los mensajes deben enviarse al cliente antes de que se envíe el estado de finalización consrv_senddone.La
srv_sendrowfunción se llama una vez por cada fila enviada al cliente. Todas las filas deben enviarse al cliente antes de que se envíen mensajes, valores de estado o estados de finalización consrv_sendmsg, elsrv_statusargumento desrv_pfield, osrv_senddone.Enviar una fila que no tiene todas sus columnas definidas
srv_describehace que la aplicación genere un mensaje de error informativo y devuelvaFAILal cliente. En este caso, la fila no se envía.
Crear procedimientos almacenados ampliados
Un procedimiento almacenado extendido es una función en C/C++ con un prototipo:
SRVRETCODE xp_extendedProcName (SRVPR *);
Usar el prefijo xp_ es opcional. Los nombres de procedimientos almacenados extendidos son sensibles a mayúsculas minúsculas cuando se referencian en Transact-SQL sentencias, independientemente de la página de códigos o orden de ordenamiento instalados en el servidor. Cuando construyes un DLL:
Si es necesario un punto de entrada, escribe una
DllMainfunción.Esta función es opcional. Si no lo proporcionas en código fuente, el compilador enlaza su propia versión, que no hace más que devolver
TRUE. Si proporcionas unaDllMainfunción, el sistema operativo llama a esta función cuando un hilo o proceso se conecta o separa de la DLL.Todas las funciones llamadas desde fuera de la DLL (todas las Efunciones de procedimientos almacenados extendidos) deben exportarse.
Puedes exportar una función listando su nombre en la
EXPORTSsección de un.defarchivo, o puedes prefijar el nombre de la función en el código fuente con__declspec(dllexport), una extensión del compilador de Microsoft (__declspec()comienza con dos guiones bajos).
Estos archivos son necesarios para crear una DLL de procedimiento almacenado extendido.
| Archivo | Description |
|---|---|
srv.h |
Archivo de cabecera de API de procedimientos almacenados extendidos |
opends60.lib |
Biblioteca de importación para opends60.dll |
Para crear una DLL de procedimiento almacenado extendido, crea un proyecto del tipo Dynamic Link Library. Para más información sobre cómo crear una DLL, consulte la documentación del entorno de desarrollo.
Todas las DLL de procedimientos almacenados extendidos deben implementar y exportar la siguiente función:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) es una extensión de compilador específica de Microsoft. Si tu compilador no soporta esta directiva, deberías exportar esta función en tu DEF archivo bajo la EXPORTS sección.
Cuando SQL Server se inicia con la bandera -T260 de trazado o si un usuario con privilegios de administrador del sistema se ejecuta DBCC TRACEON (260), y si la DLL de procedimiento almacenado extendido no soporta __GetXpVersion(), se imprime el siguiente mensaje de advertencia en el registro de errores (__GetXpVersion() comienza con dos guiones bajos).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Si la DLL del procedimiento almacenado extendido exporta __GetXpVersion(), pero la versión devuelto por la función es menor que la versión requerida por el servidor, se imprime un mensaje de advertencia indicando la versión devuelto por la función y la versión esperada por el servidor en el registro de errores. Si recibes este mensaje, estás devolviendo un valor incorrecto de __GetXpVersion(), o estás compilando con una versión antigua de srv.h.
Nota:
SetErrorMode, una función Win32, no debería llamarse en procedimientos almacenados extendidos.
Los procedimientos almacenados extendidos de larga duración deben llamar srv_got_attention periódicamente, para que el procedimiento pueda terminarse si la conexión se corta o si el lote es abortado.
Para depurar una DLL de procedimiento almacenado extendido, cópiala al directorio de SQL Server \Binn . Para especificar el ejecutable de la sesión de depuración, introduzca la ruta y el nombre del archivo ejecutable de SQL Server (por ejemplo, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Para información sobre sqlservr argumentos, véase Aplicación sqlservr.
Añadir un procedimiento almacenado extendido a SQL Server
Una DLL que contiene funciones de procedimiento almacenado extendidas actúa como una extensión de SQL Server. Para instalar la DLL, copia el archivo a un directorio, como el que contiene los archivos DLL estándar de SQL Server (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn por defecto).
Después de que la DLL de procedimiento almacenado extendido se copie al servidor, un administrador del sistema de SQL Server debe registrar en SQL Server cada función de procedimiento almacenado extendido en la DLL. Esto se hace mediante el sp_addextendedproc procedimiento almacenado del sistema.
Importante
El administrador del sistema debe revisar detenidamente un procedimiento almacenado extendido para asegurarse de que no contiene código dañino o malicioso antes de añadirlo al servidor y conceder permisos de ejecución a otros usuarios. Valide todos los datos proporcionados por el usuario. No concatenes la entrada del usuario antes de validarla. No ejecute nunca un comando creado a partir de una entrada de usuario no validada.
El primer parámetro de sp_addextendedproc especifica el nombre de la función, y el segundo parámetro especifica el nombre de la DLL en la que reside esa función. Deberías especificar la ruta completa de la DLL.
Nota:
Las DLLs existentes que no estaban registradas con una ruta completa no funcionan tras actualizar a SQL Server 2005 (9.x) o a una versión posterior. Para corregir el problema, se utiliza sp_dropextendedproc para desregistrar la DLL y luego volver a registrarla especificando sp_addextendedproc, la ruta completa.
El nombre de la función especificada en sp_addextendedproc debe ser exactamente el mismo, incluyendo el caso, que el nombre de la función en la DLL. Por ejemplo, este comando registra una función xp_hello, ubicada en un dll llamado xp_hello.dll, como un procedimiento almacenado extendido de SQL Server:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Si el nombre de la función especificada en sp_addextendedproc no coincide exactamente con el nombre de la función en la DLL, el nuevo nombre se registra en SQL Server, pero el nombre no es utilizable. Por ejemplo, aunque xp_Hello está registrado como un procedimiento almacenado extendido de SQL Server ubicado en xp_hello.dll, SQL Server no puede encontrar la función en la DLL si la llamas xp_Hello más adelante.
-- 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;
Este es el mensaje de error:
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 la función en la DLL, y la colocación de la instancia de SQL Server es insensible a mayúsculas y minúsculas, el usuario puede llamar al procedimiento almacenado extendido usando cualquier combinación de letras minúsculas y mayúsculas del nombre.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example succeeds 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 clasificación de la instancia de SQL Server es sensible a mayúsculas minúsculas, SQL Server no puede llamar al procedimiento almacenado extendido si el procedimiento se llama con un caso diferente. Esto es cierto incluso si se registrara exactamente con el mismo nombre y clasificación que la función en la DLL.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example results in an error
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;
Este es el mensaje de error:
Server: Msg 2812, Level 16, State 62, Line 1
No necesitas parar y reiniciar SQL Server.
Consulta procedimientos almacenados extendidos instalados en SQL Server
Un usuario autenticado por SQL Server puede mostrar los procedimientos almacenados extendidos definidos actualmente y el nombre de la DLL a la que pertenece cada uno ejecutando el sp_helpextendedproc procedimiento del sistema. Por ejemplo, el siguiente ejemplo devuelve la DLL a la que xp_hello pertenece:
sp_helpextendedproc 'xp_hello';
Si sp_helpextendedproc se ejecuta sin especificar un procedimiento almacenado extendido, se muestran todos los procedimientos almacenados extendidos y sus DLLs.
Eliminar un procedimiento almacenado extendido de SQL Server
Para eliminar cada función de procedimiento almacenado extendido en una DLL de procedimiento almacenado extendido definida por el usuario, un administrador de sistema SQL Server debe ejecutar el sp_dropextendedproc procedimiento almacenado del sistema, especificando el nombre de la función y el nombre de la DLL en la que reside dicha función. Por ejemplo, este comando elimina la función xp_hello, ubicada en una DLL llamada xp_hello.dll, de SQL Server:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc No elimina los procedimientos almacenados extendidos del sistema. En su lugar, el administrador del sistema debería denegar EXECUTE el permiso sobre el procedimiento almacenado extendido al rol público .
Descargar una DLL de procedimiento almacenado extendido
SQL Server carga una DLL de procedimiento almacenado extendido tan pronto como se realiza una llamada a una de las funciones de la DLL. La DLL permanece cargada hasta que el servidor se apaga o hasta que el administrador del sistema utiliza la DBCC instrucción para descargarla. Por ejemplo, este comando descarga el xp_hello.dll, permitiendo al administrador del sistema copiar una versión más reciente de este archivo al directorio sin apagar el servidor:
DBCC xp_hello(FREE);
Contenido relacionado
- Integración de Common Language Runtime (CLR)
- Funciones Table-Valued CLR
- Procedimientos almacenados extendidos del motor de bases de datos - Programación
- Consulta de procedimientos almacenados extendidos instalados en SQL Server
- srv_got_attention (API de procedimientos almacenados extendidos)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- NOMBRE DLL DDCC (GRATIS) (Transact-SQL)