我想写一个'通用'脚本来操作许多数据库。 'use databasename'命令将分发在脚本体中。我宁愿在脚本的顶部显示数据库名称信息。理想情况下:
declare @db varchar(100) set @db = 'data_in' use @db
这失败了。也许
declare @db varchar(100) set @db = 'data_in' exec ('use '+@db)
执行此操作,但可能仅在字符串中的查询上下文中更改数据库。
那么有没有其他方法可以将整个脚本放入字符串并以这种方式执行它,即。治愈比疾病更糟?
答案 0 :(得分:5)
在SQLCMD中查看脚本变量。
这使您能够以以下形式将变量放入脚本中:
USE $(db1_name)
...some code...
USE $(db2_name)
...some code...
从环境变量,运行时提供的参数或硬编码值赋值中插入变量值。
答案 1 :(得分:2)
Ed已经提到过SQLCMD,这是一个非常好的脚本选择。
如果这不适合您,并且您拥有服务器的权限,并且您不介意使用未记录的功能和修改主数据库的风险,您可能会查看用户定义的系统存储过程
在master数据库中创建用户定义的系统存储过程(UDSSP),前缀为“sp_”,并使用未记录的系统proc sp_MS_marksystemobject(SQL2005)标记为系统对象。
它从当前连接获取其数据库上下文,或者如果这样调用,则采用三部分名称。
示例调用:
declare @db sysname
declare @sql nvarchar(max)
set @db = 'yourdatabase'
set @sql = 'exec '+quotename(@db)+'..sp_@yourproc'
exec (@sql)
注意:
如果你选择这条路线,我强烈建议你使用一个独特的前缀来排序,比如sp_ @ yourproc,而不是sp_yourproc,所以你以后可以再找到它们,其他人都知道它们是什么东西特别
程序标记为系统后,无法更新。要进行更改,您必须删除,重新创建和备注为系统。
除非你知道自己在做什么并做了一些研究,否则不要这样做。如果你厌恶风险,不要这样做。如果您没有要首先进行测试的开发实例,请不要这样做。
将UDSSP备份到文件或CSV。服务器升级可以将其清除。
答案 2 :(得分:1)
您可以 NOT 在您的脚本中放置一个use语句,并使用osql命令(或您正在使用的任何内容)为数据库提供如下:
osql -S servername -d databasename -U username -P password -i script.sql
答案 3 :(得分:1)
我认为你的推定是正确的;我昨天遇到了同样的问题。我通过将命令放入单个字符串来解决它。你为什么不喜欢这个解决方案?