我正在尝试使用以下代码找出所有数据库中是否存在特定的索引名称“Test”。对于实例中的所有数据库,我得到的结果始终是“不存在”。但是,索引确实存在于少数数据库中。有人可以指出代码错误的地方吗?
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
结果:
INDEX DOES NOT EXIST DB1
INDEX DOES NOT EXIST DB2
INDEX DOES NOT EXIST DB3
INDEX DOES NOT EXIST DB4
您的问题可能与在游标内发出 USE 有关。相反,我建议使用以下方法,这样您就可以摆脱光标。
请注意,从技术上讲,sp_MSforeachdb 是一个未记录的功能,但它可以正常工作。
当
USE
出现在嵌套批处理中时,它仅影响该批处理中的语句。批处理完成后恢复数据库上下文。例如输出