REVISIÓN: La función fn_get_sql devuelve texto SQL para utilizarlo en la tabla del sistema Sysprocesses

Seleccione idioma Seleccione idioma
Id. de artículo: 325607 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se trata una revisión funcional de SQL Server 2000 que implementa los cambios siguientes:
  • La revisión crea una nueva función con valor de tabla del sistema fn_get_sql.

  • La revisión agrega estas tres nuevas columnas al final de la tabla del sistema master..sysprocesses:

    • sql_handle(binary)
    • stmt_start(int)
    • stmt_end(int)


  • La revisión crea un nuevo indicador de traza, el 2861.

Solución

Para resolver este problema, consiga el Service Pack más reciente para Microsoft SQL Server 2000. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211 INFO: Cómo obtener el Service Pack más reciente de SQL Server 2000
NOTA: la revisión siguiente se creó antes de aparecer Microsoft SQL Server 2000 Service Pack 3.

Archivo de revisión

Hay una revisión para SQL Server 2000 que implementa la función fn_get_sql.

Póngase en contacto con los Servicios de soporte técnico de Microsoft para obtener la revisión. La versión en inglés de esta revisión tiene los atributos de archivo enumerados en la siguiente tabla u otros posteriores. La fecha y la hora de estos archivos se muestran según el Horario universal coordinado (UTC). Cuando vea la información de archivo, se convertirá a la hora local. Para ver la diferencia entre la hora UTC y la hora local, utilice la ficha Zona horaria de la herramienta Fecha y hora del Panel de control.
   Fecha       Hora     Versión    Tamaño         Nombre de archivo
   --------------------------------------------------------------------------------------------

   07/01/2002   4:50 PM   8.00.652   7.285 kilobytes   Sqlservr.exe
				
NOTA: debido a las dependencias de archivos, la revisión o característica más reciente que contiene estos archivos quizás contenga también archivos adicionales.

IMPORTANTE: si desea disponer de la funcionalidad de esta revisión, debe aplicar una compilación de Sqlservr.exe posterior o igual a la 8.00.652, y ejecutar el archivo Sp2_qfe_serv_uni.sql que se incluye en esta revisión. Para obtener más información, consulte el archivo Readme.txt incluido entre los archivos de la revisión.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información en este artículo se refiere a:" de este artículo.
Este problema se corrigió por primera vez en el Service Pack 3 de Microsoft SQL Server 2000.

Más información

A continuación se define y se explica la sintaxis de la función con valor de tabla del sistema fn_get_sql.

fn_get_sql

Devuelve el texto SQL relacionado con el identificador especificado.

Sintaxis

fn_get_sql ([@SqlHandle = ]SqlHandle)

Argumentos

[@SqlHandle = ] SqlHandle

Valor del identificador binario. SqlHandle es binary(20) y no tiene valor predeterminado.

Tablas devueltas

Contraer esta tablaAmpliar esta tabla
Nombre de columna Tipo de datosDescripción
dbidsmallintIdentificador de la base de datos. NULL en el caso de instrucciones SQL ad-hoc.
objectidintIdentificador del objeto de base de datos. Identificador de la base de datos. NULL en el caso de instrucciones SQL ad-hoc.
númerosmallintNúmero en la agrupación de procedimientos, si están agrupados. 0 para las entradas que no sean procedimientos. NULL en el caso de instrucciones SQL ad-hoc.
encryptedbitIndica si el objeto está cifrado:
0 = Sin cifrar
1 = Cifrado
TexttextoTexto de SQL. NULL en el caso de objetos cifrados.

Observaciones

Fn_get_sql es una función con valor de tabla del sistema que devuelve el texto SQL para el SQLHANDLE especificado. Puede obtener un identificador SQLHANDLE válido de la columna sql_handle de la tabla del sistema sysprocesses.

Si pasa un identificador que ya no exista en la caché, fn_get_sql devolverá un conjunto de resultados vacío. Si pasa un identificador no válido, el lote se cancelará y aparecerá un mensaje de error similar al siguiente:

Servidor: Msg 569, Nivel 16, Estado 1, Procedimiento fn_get_sql, Línea 12 El identificador pasado a fn_get_sql no era válido.
SQL Server no puede almacenar en caché algunas instrucciones de Transact-SQL, por ejemplo, las de operaciones masivas y otras con literales de cadena mayores de 8 KB. Los identificadores de esas instrucciones no se pueden recuperar a través de la función fn_get_sql.

La columna de texto se filtra para para obtener el texto que contenga contraseñas. Repase el tema que trata de la limitación de trazas en Libros en pantalla de SQL Server para obtener detalles acerca de los procedimientos almacenados relacionados con la seguridad que no se supervisan.

Permisos

Sólo los miembros de la función fija de servidor sysadmin pueden ejecutar la función fn_get_sql.

Ejemplos

La información devuelta por la función fn_get_sql es similar al comando DBCC INPUTBUFFER. Use la función fn_get_sql en situaciones en las que DBCC INPUTBUFFER esté limitada, por ejemplo:
  • Cuando los eventos tienen más de 255 caracteres.
  • Cuando tenga que volver del máximo nivel de anidamiento de un procedimiento almacenado. Por ejemplo, dos procedimientos almacenados se denominan sp_1 y sp_2. Si el procedimiento almacenado sp_1 llama a sp_2 y consigue el identificador a partir de la tabla del sistema sysprocesses mientras se ejecuta sp_2, la función fn_get_sql devolverá información acerca de sp_2. Además, la función fn_get_sql devuelve todo el procedimiento almacenado al máximo nivel de anidamiento actual.
Los administradores de base de datos pueden usar la función fn_get_sql para ayudar a diagnosticar procesos problemáticos. Una vez que un administrador determina el identificador de proceso (SPID) del servidor con problemas, puede recuperar el SQLHANDLE para dicho SPID y a continuación llamar a la función fn_get_sql con el identificador y usar la posición inicial y final para determinar el texto SQL del SPID del servidor problemático. Por ejemplo:
DECLARE @Handle binary(20)
SELECT @Handle = sql_handle FROM sysprocesses WHERE spid = 52
SELECT * FROM ::fn_get_sql(@Handle) 
				
También puede usar la función fn_get_sql para supervisar continuamente el servidor. Por ejemplo, una herramienta cliente recupera periódicamente el SQLHANDLE y las posiciones inicial y final de la tabla del sistema sysprocesses. La herramienta mantiene una memoria caché de texto SQL, con el identificador SQL como clave única y los resultados de la función fn_get_sql como valor. Para cada fila del conjunto de filas de la tabla del sistema sysprocesses, la herramienta busca el texto en su caché basándose en el SQLHANDLE. Si el texto no se halla en la caché de la herramienta, entonces ésta llama a la función fn_get_sql para conseguirlo y guardarlo allí.

Indicador de traza 2861

El indicador de traza 2861 indica a SQL Server que conserve los planes con costo cero en la caché, que normalmente SQL Server no almacenaría allí (por ejemplo, los de consultas sencillas ad-hoc, instrucciones set, transacciones confirmadas, etcétera).
  • Si el indicador de traza 2861 está activado, la función fn_get_sql puede devolver el texto SQL para las actividades que tengan planes con costo cero. Si el indicador de traza 2861 está desactivado, la función fn_get_sql no puede devolver el texto SQL para las actividades que tengan planes con costo cero.
  • De forma predeterminada, el indicador de traza 2861 se desactiva cuando se aplica esta revisión.

Observaciones

El número de objetos en la caché de procedimientos aumenta cuando se activa el indicador de traza 2861. Dado que los objetos adicionales son tan pequeños, observará un mínimo incremento en la memoria, que se dedica a la caché de procedimientos.

SQL Server 2000 tiene un algoritmo muy eficiente para buscar cualquier plan de ejecución correspondiente a una instrucción SQL concreta. Sin embargo, debido al aumento del número de objetos almacenados en la caché de procedimientos, es posible que el tiempo que el motor relacional tarda en buscar un plan que existe se degrade y afecte adversamente al rendimiento del sistema.

Por lo general, los sistemas en los que el tamaño de la base de datos es mucho mayor que el de la memoria soportan un uso de la memoria mayor de lo esperado. Si la utilización de memoria es tal que ésta se requiere para otros objetos, el proceso de escritura lenta anulará la asignación de los objetos en la caché de procedimientos. De este forma se fija el tamaño de la caché de procedimientos y se consigue reducir el posible efecto adverso de este cambio.

No obstante, los sistemas en los que el tamaño de la memoria es mucho mayor que el de la base de datos no suelen experimentar un uso excesivo de la memoria. Por tanto, los objetos no se desasignan de la caché de procedimientos debido a necesidades de memoria y el tamaño de la caché de procedimientos puede crecer hasta un punto en el que afectará adversamente al rendimiento.

Si aprecia un efecto adverso en el rendimiento del sistema, siga estos pasos:
  1. Desactive el indicador de traza 2861.
  2. Ejecute el comando DBCC FREEPROCCACHE en el Analizador de consultas. No es necesario que reinicie SQL Server.

Propiedades

Id. de artículo: 325607 - Última revisión: viernes, 07 de noviembre de 2003 - Versión: 4.1
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
Palabras clave: 
kbsqlserv2000sp3fix kbfix kbinfo kbsqlserv2000presp3fix KB325607

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com