如何为名称存储在表中的多个数据库执行T-SQL

emz*_*ero 7 database iteration sql-server-2005

嘿伙计们,所以这就是交易.

我在同一台服务器上有几个数据库(SqlServer 2005),它们具有相同的模式但数据不同.

我有一个额外的数据库,其中有一个表存储所提到的数据库的名称.

所以我需要做的是迭代这些数据库名称并实际"切换"到每个数据库(使用[dbname])并执行T-SQL脚本.我清楚了吗?

让我举个例子(从真实的简化):

CREATE TABLE DatabaseNames
(
   Id   int,
   Name varchar(50)
)
INSERT INTO DatabaseNames SELECT 'DatabaseA'
INSERT INTO DatabaseNames SELECT 'DatabaseB'
INSERT INTO DatabaseNames SELECT 'DatabaseC'
Run Code Online (Sandbox Code Playgroud)

假设DatabaseA,DatabaseB和DatabaseC是真实的现有数据库.所以我要说我需要在这些数据库上创建一个新的SP.我需要一些循环遍历这些数据库并执行我指定的T-SQL脚本的脚本(可能存储在varchar变量或任何地方).

有任何想法吗?

谢谢!

dev*_*vio 2

我想这在 TSQL 中通常是不可能的,因为正如其他人指出的那样,

  • 您首先需要使用 USE 语句来更改数据库,

  • 后跟要执行的语句,尽管未指定,但该语句是 DDL 语句,必须位于批处理中的第一个语句。

  • 此外,要执行的字符串中不能有 GO。

我找到了一个调用 sqlcmd 的命令行解决方案:

for /f "usebackq" %i in 
    (`sqlcmd -h -1 -Q 
     "set nocount on select name from master..sysdatabases where status=16"`)
    do
        sqlcmd -d %i -Q "print db_name()"
Run Code Online (Sandbox Code Playgroud)

示例代码使用当前的 Windows 登录名从 Master 查询所有活动数据库(替换为您自己的连接并查询数据库),并对找到的每个数据库执行文字 TSQL 命令。(换行只是为了清楚起见)

查看sqlcmd 的命令行参数。您也可以向它传递一个 TSQL 文件。

如果您想允许手动选择数据库,请查看SSMS Tools Pack