在开始之前,我需要指出我是一个SQL菜鸟。我可以编写基本语句,但是任何超过JOIN语句的内容对我来说都可能是新的。
那就是说,我拼凑了一个删除表中记录的脚本。脚本本身可以完成它需要做的事情;但是,当我运行这个脚本时,我改变了" USE"行到下一个数据库,手动逐步执行数据库。我使用一个命令,用一个数据库名列表作为参考来填充临时表。
如何直接对临时表中的每个数据库名称运行我的脚本,最好是从单个存储过程中运行?
答案 0 :(得分:0)
嗯,一个选项是你可以使用游标来获取所有数据库名称(不包括你不想执行的数据库),并使用动态sql为每个数据库执行。不幸的是,它必须是“动态的”,因为你不能只做一个while循环,USE @dbname
/*your magic code*/
Fetch Next from MyCursor into @dbname
...它在尝试USE @dbname
时出错了,所以你实际上做必须在其中使用exec @variable
。
DECLARE @dbname varchar(max)
DECLARE @executeme nvarchar(max)
DECLARE DBCursor CURSOR FOR
SELECT Name
FROM sys.databases
WHERE name not in ('master', 'tempdb', 'model', 'msdb'); --add additional exclusions here
OPEN DBCursor;
FETCH NEXT FROM DBCursor INTO @dbname;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @executeme =
N'use '+@dbname+'
--YOUR SCRIPT HERE
'
EXEC sp_executesql @executeme
FETCH NEXT FROM DBCursor into @dbname;
END;
CLOSE DBCursor;
DEALLOCATE DBCursor;
GO
这将遍历所有数据库,在每个数据库中执行您的脚本,直到数据库列表中没有任何内容。您可以在游标的select语句中排除某些数据库(如主文件等),并添加任何您认为适合排除的其他逻辑。
此外,您可以在存储过程中实现此功能,因此您只需运行存储过程,坐下来喝着您喜欢的饮料,同时为您提供繁重的工作;)