如何通过游标一起获取所有数据库的总和

时间:2011-10-07 06:25:09

标签: sql-server database-cursor

我在sql查询中陷入了一个地方。我有20个数据库,所有数据库的表名和列名相同但数据不同。我正在创建一个SQL查询,以便从所有数据库中获取特定日期的付款金额。

我在付款表中有很多列。我需要关于paymentTypeID列的总和(金额),因为我可以在paymentTypeID的基础上获得金额。所有paymentTypeID在数据库中都不同,但有时它们是相同的。我为此创建了一个游标。

我的代码是:

 create table #tmpDBs(DBName varchar(255), CurrentDayPaymentAmount float)

 declare cDBs cursor for

 select name from master.dbo.sysdatabases

 declare @DB varchar(255)

 open cDBs
 fetch next from cDBs into @DB
 while @@fetch_status = 0
 begin
 exec('

 declare @DateCurrent datetime

 set @DateCurrent = '{Current Date}'

 insert into #tmpDBs

 select DBName = ' + @DB + ',

 CurrentDayPaymentAmount = (select sum(p.amount) from ' + @DB + '.dbo.Payment p     where     p.eDate between @DateCurrent and dateadd(day, 1, @DateCurrent) and     (p.paymenttypeid in (14, 15, 16, 17, 21, 22, 24, 35, 37, 38, 50)))

 ')
 fetch next from cDBs into @DB 
 end 
 close cDBs
 deallocate cDBs
 select * from #tmpDBs
 drop table #tmpDBs

我使用In子句将所有数据库paymenttypeid一起传递。 此代码用于从2个数据库中检索付款金额。 paymenttypeid 14,15,16,17,22,24,38用于第一数据库,21,35,37,50用于第二数据库。我的问题是,当我将这些paymentTypeID放在 In 子句中时,它会添加其他数据库的匹配paymenttypeid的数量。 例如,如果第一个数据库实际数量是4589 $,但它通过使用第二个数据库paymenttypeid添加额外的金额5469 $。如果我只传递一个数据库paymenttypeid,则显示正确的数量。

我的查询中有什么问题。

1 个答案:

答案 0 :(得分:1)

我认为您自己解释了这个问题:您只需要DB1中的类型1,2和3以及DB2中只需要类型4,5和6,但您的查询不会这样做,它会询问类型1,2,来自DB1和DB2的3,4,5和6。

这意味着您需要为每个数据库使用不同的WHERE子句,具体取决于您需要的类型。那么,您如何知道每个数据库中需要哪些类型,以及如何在存储过程中表达该逻辑?

作为一个完全不同的解决方案,使用正确的WHERE子句在每个数据库中创建一个视图,然后只查询报告的视图。