2011-07-13 123 views
0

我創建了一個SQL Server 2005存儲過程,它在特定的表上查找相關對象。在遊標中調用存儲過程

我想爲不同的數據庫和不同的表運行此存儲過程。我爲此創建了光標。

當我編寫USE @dbname時,它會嘗試在@dbname中查找存儲過程,而不是當前數據庫。

任何人都可以幫助我如何在光標中寫入此命令?

DECLARE name_cur CURSOR FOR 
    SELECT db_name, obj_name from Stats_Usage 
    WHERE last_user_update > '2011-06-01' ORDER BY db_name 
DECLARE @tableName NVARCHAR (800) 
DECLARE @dbName NVARCHAR(800) 
DECLARE @sql NVARCHAR(900) 
OPEN name_cur 
FETCH name_cur INTO @dbName, @tableName 
WHILE @@Fetch_Status = 0 
BEGIN 

SET @sql = 'USE '[email protected] +' EXEC proc_depend ' + @tableName 
EXEC (@sql) 
FETCH name_cur INTO @dbName, @tableName 
END 
CLOSE name_cur 
DEALLOCATE name_cur 
GO 

回答

2

您可以fully qualify您的存儲過程的名稱。

假設你的SP駐留在被稱爲procs(例如)的數據庫,你可以修改你的查詢中使用下列內容:

SET @sql = 'USE '[email protected] +' EXEC procs.dbo.proc_depend ' + @tableName 
EXEC (@sql) 
+0

是的它的工作!我在我寫的存儲過程中創建一個表。但是當我從上面的查詢中調用它時,它會返回一個錯誤,表明該表已經存在。當我們運行存儲過程時,表是否被創建?我很困惑。 – CamAd

+0

但是,對於執行哪個數據庫最新的程序真的很重要嗎?我認爲SP引用的所有對象都被認爲與SP位於同一數據庫中,除非它們使用不同的數據庫名稱進行顯式限定。 –

1

重構您的存儲過程,以檢查相關對象的跨數據庫。你要發送這樣的命令:

exec proc_depend 'MyDatabase.dbo.MyTable'; 

試試這個:

SET @sql = ' EXEC proc_depend ''' @dbName + '.dbo.'+ @tableName + '''; 

你需要深入&修改proc_depend,以確保它可以採取一個完全合格的對象像database.schema.table

+0

我收到上述解決方案的語法錯誤。 – CamAd

+0

@anjali:可能你會。您可能需要向您的proc發送一個字符串。 –

+0

很抱歉,我沒有收到你。 – CamAd