none
Sentencias que ejecuta un API CURSOR RRS feed

  • Pregunta

  • Tenemos en la empresa una aplicación hecha por terceros que a veces provoca una serie de interbloqueos que afectan al rendimiento de la misma. Ejecutando el Profiler se puede ver el proceso bloqueado y el que produce el bloqueo, pero siempre el que bloquea es un FETCH API_CURSOR que no se determinar qué sentencias SQL está ejecutando.

    Mi pregunta es cómo saber qué es lo que está haciendo ése cursor, es decir, se puede saber con una query en alguna tabla del sistema qué sentencia se está ejecutando?.

    Muchas gracias de antemano.

     

    lunes, 15 de julio de 2013 13:53

Respuestas

Todas las respuestas

  • Hola,

    En el siguiente post encontrarás una posible solución a tu problema: http://www.sqlskills.com/blogs/joe/hunting-down-the-origins-of-fetch-api_cursor-and-sp_cursorfetch/

    Se basa en utilizar una serie de DMV que te permiten obtener la información deseada (principalmente la consulta que está provocando el bloqueo).

    ¡Espero que te sirva!

    Saludos.


    Ferran Chopo
    MCPD Web, MCSE: Data Platform
    Web: http://www.ferranchopo.com Twitter: @fchopo

    lunes, 15 de julio de 2013 15:19
  • Muchas gracias por tu repuesta.

    Ya había visto ese link que comentas en tu repuesta, pero no me sirve porque no me está funcionando. No me da la información de las sentencias que ejecuta el Cursor.

    martes, 16 de julio de 2013 9:35
  • Pero tienes identificado el Cursor que se lanza osea el Procedimiento,Funcion, Job o lo que sea que lo lanza, si no lo encuentras o no sabes desde donde se lanza prueba a buscarlo con este codigo, solo te falta rellenar el nombre de la BBDD y lanzarlo te dira donde se encuentra ese cursor,

    DECLARE @DB VARCHAR(255)
    DECLARE @SQL NVARCHAR(4000)
    DECLARE CUR CURSOR FORWARD_ONLY FOR
    SELECT NAME
    FROM MASTER.SYS.DATABASES
    where name = 'MI_BASEDATOS' -- nombre de la bbdd
    OPEN CUR
    FETCH NEXT FROM CUR INTO @DB
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	PRINT '/************** ' + @DB + ' **************/'
    	SET @SQL = 'SELECT ' + @DB + ' = N''EXEC sp_helptext ''''''+ QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))+ ''.'' + QUOTENAME(OBJECT_NAME([object_id])) + '''''';''
    				FROM sys.sql_modules
    				WHERE [definition] LIKE ''%FETCH API_CURSOR%''' -- aqui pones el trozo de texto que buscas
    	EXEC('USE ' + @DB + ' IF EXISTS(' + @SQL + ') ' + @SQL)
    	FETCH NEXT FROM CUR INTO @DB
    END
    CLOSE CUR
    DEALLOCATE CUR
    Una vez que lo tengas localizado examinalo o pegalo y lo vemos.
    • Propuesto como respuesta Bud_Spencer martes, 16 de julio de 2013 15:49
    martes, 16 de julio de 2013 10:01
  • Muchas gracias por la respuesta.

    En cuanto tenga un bloqueo en la aplicación, ejecutaré el código que me pasas y comento lo ocurrido.

    Un saludo.

    martes, 16 de julio de 2013 16:39
  • Buenos días. Esta mañana hemos tenido una serie de bloqueos en la aplicación. He ejecutado el código que me comentaste ayer pero no me devuelve nada. Te envío un par de pantallazos con la traza del profiler y la ejecución de tu código.

    Muchas gracias.

    miércoles, 17 de julio de 2013 9:07