サーバー上のすべてのデータベースを反復処理し、いくつかの異なるデータベースからのデータの集計をテーブル変数に入力するストアドプロシージャを作成しています。関係がないので興味のないデータベースもあります。問題は、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を実行できます。