我创建了一个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
答案 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