2012-03-30 4 views
2

괜찮은 것처럼 보이고 80 %의 시간 동안 작동하는 약간의 프로덕션 코드를 보았지만 나머지 20 %는 반환을 멈추고 명백한 이유가없는 데이터베이스 목록 :데이터베이스에서 커서를 건너 뛰는 sys.databases

DECLARE c_UserDatabases CURSOR FOR 
    SELECT Name 
    FROM Sys.Databases SD (NOLOCK) 
    ORDER BY Name 

OPEN c_UserDatabases 
FETCH Next FROM c_UserDatabases INTO @v_DatabaseName 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- Query that takes a few minutes to run (using dynamic SQL and EXEC, etc) 
     FETCH Next FROM c_UserDatabases INTO @v_DatabaseName 
    END 

CLOSE c_UserDatabases 
DEALLOCATE c_UserDatabases 

이것은 SQL Server 2008 SP3에 있습니다. 나는 당신이 이름으로 주문하지 않았다면 그것을 언급하는 기사를 보았습니다 만, 어떤 버전에서는 iffy 였지만이 실패 조건을 나타내는 것은 아무것도 아닙니다. 나는 내부 섹션이 너무 오래 실행될 수 있기 때문에 드문 상황에 처한 것 같아요?

다른 사람이 본 적이 있는지 알고 싶습니다. 대신 그것을 통해 임시 테이블과 커서로 선택하여 다시 작성 계획입니다.

+1

왜 SYS.DATABASES에서 NOLOCK을 사용하고 있습니까?! –

+0

코드를 작성하지 않았습니다. 하지만 장기 실행 중에 사용자/로그인 테이블의 장기 실행 커서가 로그인을 방해하는 문제를 엿 들었습니다. 그런 다음 세이프 가드 (safeguard)로 추가되었을 수 있습니다. 왜 묻는거야. –

답변

2

이 내 정말 오래된 질문이지만 대답은 당신이하려면 sys.databases을 반복하는 경우 커서 유형이 STATIC해야한다고했다.

그렇지 않으면 반복하는 동안 해당 테이블에 문제가 발생하면 (예 : 백업 등) 데이터베이스를 건너 뛸 수 있습니다. sp_MSForeachDB와 동일합니다.

감사하게 우리는이 비트를 오래 전에 이동했습니다. 그리고 네, NOLOCK이 나왔습니다.

1

문서화되지는 않았지만 sp_MSForeachDB는 모든 DB에 대해 쿼리를 실행하는 좋은 방법을 제공합니다. 이 접근이 도움이 될까요?

EXEC sp_MSForeachDB ' 
    SELECT * FROM [?].sys.tables 
' 
관련 문제