在游标中调用存储过程

时间:2011-07-13 16:22:57

标签: sql sql-server-2005 tsql stored-procedures cursor

我创建了一个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 '+@dbName +' EXEC proc_depend ' + @tableName
EXEC (@sql)
FETCH name_cur INTO @dbName, @tableName
END
CLOSE name_cur
DEALLOCATE name_cur
GO

2 个答案:

答案 0 :(得分:2)

您可以fully qualify您的存储过程名称。

假设您的SP所在的数据库名为procs(例如),您可以修改您的查询以使用以下内容:

SET @sql = 'USE '+@dbName +' EXEC procs.dbo.proc_depend ' + @tableName
EXEC (@sql)

答案 1 :(得分:1)

重构您的存储过程以检查跨数据库的依赖对象。你会想要发送一个这样的命令:

  exec proc_depend 'MyDatabase.dbo.MyTable';

请改为尝试:

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

你需要深入了解&修改proc_depend以确保它可以采用完全限定的对象名称,如database.schema.table