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变量或任何地方).
有任何想法吗?
谢谢!
我想这在 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。