如何在使用游标或类似的东西时更改数据库?

时间:2015-07-29 05:34:21

标签: sql sql-server sql-server-2008

我说过几个从数据库中获取值的语句,例如:

declare @intValue = 0;
use [databaseA]
select @intValue = @intValue + columnA from tableA where id = 5;

上述声明必须是多数据库,所以我想做类似的事情:

declare @intValue = 0;
use [databaseA]
select @intValue = @intValue + columnA from tableA where id = 5;

use [databaseB]
select @intValue = @intValue + columnA from tableA where id = 5;

如果我有多个数据库没有使用动态SQL,现在有没有办法简化上面的查询而不复制和粘贴几次?

我希望用光标或可能有效的东西?

可能类似

for each database in DatabaseList
use [database]
select **** statements;
end for 

我不确定是否可以不使用动态SQL。

2 个答案:

答案 0 :(得分:1)

你不能这样做。但是,还有另一种使用sp_msforeachdb存储过程循环跨数据库的方法。

要使其正常工作,请将初始值存储到临时表中,然后在找到匹配项时更新此临时表

create table #value(intvalue int)
insert into #value
select '10'

exec sp_MSforeachdb 'use [?]; 
                     update #value set intvalue = intvalue + 
                     ISNULL((select sum(columnA) from tableA 
                     where id = 5), 0)'

SUM函数将确保内部查询仅返回一行。 ISNULL会将任何NULL值转换为0.

sp_msforeachdb内部使用游标循环遍历数据库,但我推荐这种方法,因为它很简单。

答案 1 :(得分:0)

我已将未记录的sp_MsForEachDB存储过程用于此类任务 另一个非常类似的存储过程是sp_MSForEachTable,用于在数据库中的每个表上运行脚本

这是一个脚本,我必须将sql命令最小化为128个字符限制

EXEC sp_Msforeachdb "
use [?];
declare @i int=0;
if OBJECT_ID('tableA') is not null
select @i=@i+columnA from tableA where id=5;select @i,'[?]'
"