Estou tentando descobrir se um nome de índice específico "Test" existe em todos os bancos de dados usando o código abaixo. O resultado que estou obtendo é sempre "NOT EXIST" para todos os bancos de dados em uma instância. No entanto, o índice existe de fato em alguns dos bancos de dados. Alguém pode apontar onde o código está errado?
DECLARE @Name AS VARCHAR(100)
DECLARE dbCur CURSOR FOR
SELECT name FROM SYS.databases where name not in ('master','msdb','model','tempdb')
OPEN dbCur
FETCH NEXT FROM dbCur
INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
--Check if index exist
EXECUTE('USE [' + @Name + ']')
If 1 = ((SELECT COUNT(*) as index_count
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.TestTable')
AND name = 'Test'))
Print 'INDEX EXIST ' + @Name;
ELSE
Print 'INDEX DOES NOT EXIST ' + @Name;
FETCH NEXT FROM dbCur
INTO @Name
END
CLOSE dbCur
DEALLOCATE dbCur
Resultado:
INDEX DOES NOT EXIST DB1
INDEX DOES NOT EXIST DB2
INDEX DOES NOT EXIST DB3
INDEX DOES NOT EXIST DB4
Seu problema pode estar relacionado à emissão de um USE dentro de um cursor. Em vez disso, sugiro usar a seguinte abordagem, para que você possa se livrar do cursor.
Observe que, tecnicamente, sp_MSforeachdb é um recurso não documentado, mas simplesmente funciona.
Quando
USE
aparece em um lote aninhado, afeta apenas as instruções desse lote. O contexto do banco de dados é restaurado após a conclusão do lote. POR EXEMPLOsaídas