DECLARE @dbs VARCHAR(1000)
DECLARE @dbName VARCHAR(15)
DECLARE @idx INT
DECLARE @sql VARCHAR(5000)
SET @dbs ='dbName1,dbName2' --设置所有需要查询的DB, 并用逗号隔开
WHILE (LEN(@dbs) > 0)
BEGIN
SET @idx = CHARINDEX(',', @dbs)
IF (@idx > 0)
BEGIN
SET @dbName = SUBSTRING(@dbs, 0, @idx)
SET @dbs = SUBSTRING(@dbs, @idx + 1, LEN(@dbs) -@idx)
END
ELSE
SET @dbName = @dbs
SET @dbName=LTRIM(RTRIM(@dbName))
PRINT '----' + @dbName + '----'
--在多个db上执行的sql语句 begin--
--必须用 dbName.dbo.tableName 这种形式, exec('use '+@dbName)是错误的
SET @sql = 'SELECT * FROM @dbName.dbo.TableName'
--在多个db上执行的sql语句 end--
SET @sql=REPLACE(@sql,'@dbName',@dbName) --执行替换, 好处是避免在上一步sql语句复杂时使用多个+号
EXEC(@sql) --执行动态sql
--PRINT(@sql) --用于调试, 判断动态生成的sql语句是否正确
IF (@idx <= 0)
BREAK
END
--要做的事情只有两个
--1.枚举所有的db名称, 赋给@dbs, 可用下面的语句
-- Select Name FROM Master..SysDatabases order by Name
-- 如果你觉得还不省事, 上面的用文本方式得到的db名称不够方便, 里面的是回车而不是逗号, 可用下面的语句来实现
DECLARE @dbsTemp VARCHAR(5000)
SET @dbsTemp='db01 --将上面得到的db复制过来
db02'
SET @dbsTemp=REPLACE(replace(@dbsTemp,char(10),''),char(13),',') --10. 换行, 13.回车
PRINT @dbsTemp
--2.构建sql, 测试完成一条后, 在表名前加上 "@dbName.dbo. " , 赋给@sql
自动在多个DB上执行同一条sql语句
最新推荐文章于 2022-02-19 10:57:42 发布