2008-11-05 4 views
5

У меня есть хранимая процедура, которая создает и открывает некоторые курсоры. Он закрывает их в конце, но если он ошибается, эти курсоры остаются открытыми! Затем последующие прогоны терпят неудачу, когда он пытается создать курсоры, поскольку курсор с именем уже существует.Есть ли способ получить список открытых/выделенных курсоров на SQL-сервере?

Есть ли способ, который я могу запросить, какие курсоры существуют, и если они открыты или нет, я могу закрыть и освободить их? Я чувствую, что это лучше, чем слепо пытаться закрыть и проглотить ошибки.

ответ

1

Это, кажется, работает для меня:

CREATE PROCEDURE dbo.p_cleanUpCursor @cursorName varchar(255) AS 
BEGIN 

    DECLARE @cursorStatus int 
    SET @cursorStatus = (SELECT cursor_status('global',@cursorName)) 

    DECLARE @sql varchar(255) 
    SET @sql = '' 

    IF @cursorStatus > 0 
     SET @sql = 'CLOSE '[email protected] 

    IF @cursorStatus > -3 
     SET @sql = @sql+' DEALLOCATE '[email protected] 

    IF @sql <> '' 
     exec(@sql) 

END 
2

Look here для информации о том, как найти курсоры. Я никогда не использовал ни одного из них, потому что я мог бы найти способ сделать это, не выходя из Row By Agonizing Row.

Вы должны восстановить зр либо

  • не использовать курсоры (мы можем помочь - там почти всегда есть способ избежать RBAR)

  • построить его в сделке и рулоне он возвращается, если есть сбой, или если вы обнаружите ошибку. Вот несколько отличных статей об этом. part 1 и part 2

Если у вас есть SQL2005, вы можете также использовать try catch

EDIT (в ответ на ваш пост): В идеале, генерация данных лучше всего обрабатываются на уровне приложений, так как они лучше подходят для нестационарные операции.

Red Gate имеет SQL Data generator, который я использовал ранее (отлично подходит для одиночных таблиц, но требует некоторой настройки, если у вас много FK или широкая [нормализованная] база данных).

0

Вы можете использовать sp_cursor_list системы хранимой процедуру, чтобы получить список курсоров, видимых для текущего соединения и sp_describe_cursor, sp_describe_cursor_columns и sp_describe_cursor_tables для определения характеристик курсор.

(от http://msdn.microsoft.com/it-it/library/aa172595(v=sql.80).aspx)

2

Это работает на 2008R2, не испытали на что-либо ранее, чем:

USE MASTER 
GO 
select s.session_id, s.host_name, s.program_name, s.client_interface_name, s.login_name 
, c.cursor_id, c.properties, c.creation_time, c.is_open, con.text, 
l.resource_type, d.name, l.request_type, l.request_Status, l.request_reference_count, l.request_lifetime, l.request_owner_type 
from sys.dm_exec_cursors(0) c 
left outer join (select * from sys.dm_exec_connections c cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) mr) con on c.session_id = con.session_id 
left outer join sys.dm_exec_sessions s on s.session_id = c.session_id 
left outer join sys.dm_tran_locks l on l.request_session_id = c.session_id 
left outer join sys.databases d on d.database_id = l.resource_database_id