2011-10-07 63 views
1

我在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 

我曾經在條款通過所有數據庫paymenttypeid在一起。 此代碼用於從2個數據庫中檢索付款金額。 paymenttypeid 14,15,16,17,22,24,38用於第一數據庫,而21,35,37,50用於第二數據庫。我的問題是,當我將這些paymentTypeID放在子句中時,它會添加其他數據庫的匹配paymenttypeid的數量。 例如,如果第一個數據庫實際金額爲4589 $,但它通過使用第二個數據庫paymenttypeid添加額外金額,例如5469 $。如果我只通過一個數據庫paymenttypeid它顯示正確的金額。

我的查詢中有什麼問題。

回答

1

我想你自己解釋了這個問題:你只需要DB1中的類型1,2和3,而只需要DB2中的類型4,5和6,但是你的查詢不會這樣做,它會請求類型1,2 ,3,4,5和6來自DB1和DB2。

這意味着您需要爲每個數據庫使用不同的WHERE子句,具體取決於您想要的類型。那麼如何知道每個數據庫需要哪種類型,以及如何在存儲過程中表達該邏輯?

作爲一個完全不同的解決方案,使用正確的WHERE子句在每個數據庫中創建一個視圖,然後查詢報表的視圖。

+0

感謝您的回覆。我擁有使用的所有數據庫的所有PaymentTypeID。我認爲這是因爲在其他數據庫paymenttypeid中匹配一個數據庫paymenttypeid而發生的。例如,我在一個數據庫中有10個paymentid,只使用3個paymenttypeid。如果任何3個或全部3個paymenttypeid中的任何一個與其他數據庫中的匹配,則添加該數據庫的數量並顯示錯誤的數量。我有我的公司軟件,我無法創建視圖或表格。在這個軟件中,我只能運行SELECT命令,只創建臨時表和光標。這是我的問題。我該如何解決這個問題。請幫助。 –

相關問題