我正在编写一个存储过程,它遍历服务器上的所有数据库,并用来自一些不同数据库的数据聚合填充一个表变量。有些数据库我不感兴趣,因为它们无关紧要。问题是当我的 CURSOR 遍历那些我不关心的数据库时,会在不存在的表上发出 SELECT 语句。如何忽略Invalid object name
异常并继续处理?
编辑:
以下是我试图跳过不相关的数据库的方式:
DECLARE db_cursor CURSOR FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @currentDatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'SELECT COUNT(Name) FROM ' + @currentDatabaseName + '.sys.Tables WHERE Name = ''SomeTableICareAbout'''
INSERT INTO @tableSearchResult
EXEC sp_executesql @sql
SET @tableCount = (SELECT COUNT(*) FROM @tableSearchResult WHERE TableCount = 1)
--If the table I care about was found, then do the good stuff
IF @tableCount > 0
...
这种方法的问题是,如果执行用户(在我的情况下是服务帐户)无权访问表上的 SELECT,那么我永远不会知道该错误。如果用户没有 SELECT 访问权限,我希望引发该异常。但是,即使用户没有 SELECT 访问权限,它也可以在 sys.Tables 视图上进行 SELECT。