对表

时间:2015-05-07 22:06:55

标签: sql-server database

在开始之前,我需要指出我是一个SQL菜鸟。我可以编写基本语句,但是任何超过JOIN语句的内容对我来说都可能是新的。

那就是说,我拼凑了一个删除表中记录的脚本。脚本本身可以完成它需要做的事情;但是,当我运行这个脚本时,我改变了" USE"行到下一个数据库,手动逐步执行数据库。我使用一个命令,用一个数据库名列表作为参考来填充临时表。

如何直接对临时表中的每个数据库名称运行我的脚本,最好是从单个存储过程中运行?

1 个答案:

答案 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语句中排除某些数据库(如主文件等),并添加任何您认为适合排除的其他逻辑。

此外,您可以在存储过程中实现此功能,因此您只需运行存储过程,坐下来喝着您喜欢的饮料,同时为您提供繁重的工作;)