我说过几个从数据库中获取值的语句,例如:
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。
答案 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,'[?]'
"