2012-07-19 66 views
0

我對我們的SQL Server 2000數據庫有了很長的查詢,並且我返回了由C#應用程序進一步處理的結果。SQL Server 2000「收益回報」結果行爲

考慮這個查詢:

declare @sn varchar(20) 

select distinct serial_number 
from manufacturingData 
where '7/19/2012'<date_time 
order by serial_number 

while (0 < (select count(serial_number) from #sn)) begin 
    select top 1 @sn=serial_number from #sn 
    exec sp_GetSnData @sn 
    delete from #sn where [email protected] 
end 
drop table #sn 

我寫上07/19/2012此查詢,所以它只是從今天返回的記錄。

上面的查詢(今天的一半)返回了119個不同的序列號,並花費了52秒鐘來執行伴隨它的while循環。

通常情況下,此報告執行30天,並且有大約3500個零件編號。

有沒有辦法「掛鉤」結果集,以便我可以在生成結果時訪問結果?

現在的樣子,沒有人知道查詢是要花2分鐘還是2天......或者它還在做任何事情!經理關閉他的電腦並回家過一天,或者這個報告查詢是否完成?

一旦單個表被返回,那麼我需要分別處理每個表。

這將是很好,如果我能

  • 找出多少返回了不同的項目,
  • 目前正在查詢什麼項目,
  • 有可用的結果表在等待處理下一張桌子進來

這可能嗎?

僅供參考:我目前通過向我們的服務器發送單個請求來在Windows窗體中執行此操作,但這會使服務器陷入困境並耗盡所有可用的連接。

+0

時間到了哪裏?選擇不同來填充臨時表或執行存儲過程?當然,遊標會比臨時表和循環更有效率,但不會更多... – 2012-07-19 20:41:48

+0

選擇獨特只需要幾秒鐘。存儲過程一直在吃東西。 – jp2code 2012-07-19 20:42:58

+0

[DTS包](http://msdn.microsoft.com/en-us/library/cc917688.aspx)可用於執行現有循環,並在每次迭代中排隊消息或發送電子郵件。您可以將其與登臺表結合起來,以達到您的三點要點,儘管這看起來像是一種不雅而且可能很脆弱的解決方案。 – 2012-07-19 21:08:57

回答

1

根據您的意見,我會努力優化存儲的過程。

但如果你只是想給多長一些快速和簡單的指示,將採取

只是做

select Count(distinct serial_number) from manufacturingData where '7/19/2012'< date_time 

,並通過一些小提琴係數相乘亦即基於你粗糙的0.5秒錶現數字。

如果你想取得進展,那麼看看SQL服務器DMO 基本上你在你的循環中加入了一個打印語句「Processing 1 of 119 say」。 SMO將拾取輸出並觸發一個事件,您添加一個處理程序來驅動一個進度條。

注意DMO與2000一起工作,你可以得到一個向後兼容包,所以它可以在2005年和2008年一起工作。它確實(目前也適用於2012年),但它不被支持,你會生氣依靠它繼續這樣做。從2005年起,DMO被SMO取代。

我我會盡力爭取sp的optimsing,但任何快速勝利。

+0

DMO。這是一個新的。我得看看那個。獲取不同的序列號需要0秒,但存儲過程每個編號需要約2秒。問題不在於存儲過程,而在於使用Excel電子表格中的數據創建的數據表。 – jp2code 2012-07-25 17:17:33

+0

谷歌搜索之後** SQL Server 2000分佈式管理對象**並閱讀幾個鏈接([here](http://www.sqlteam.com/article/introduction-to-sql-dmo)和[here](http ://www.sqlmag.com/article/database-development/sql-dmo-learning-the-basics)),看起來DMO是我所需要的。因此,這回答了我的問題。 – jp2code 2012-07-25 18:45:28

+0

很高興提供幫助。小心你如何編寫它,試着將所有DMO的東西保存在一個地方,這樣,如果你升級到2000年以後,換到SMO不會太受打擊。 – 2012-07-25 22:35:05

2

這種情況下,您不想使用存儲的proc,而是編寫基於集的代碼。從處理一個記錄到處理很多記錄時,代碼重用通常是一件壞事。

或者修改proc,以便您可以發送逗號分隔列表並將其解析爲臨時表並執行該操作。我不知道proc是做什麼的,我建議實際的代碼來做這件事。然後它可以處理機器人單個輸入和多個輸入參數。

順便說一句,你不應該使用sp_前綴命名procs,因爲它會先在系統特效中尋找它們,然後在用戶特效中尋找它們,這樣你就可以獲得性能上的提升(雖然個人很小,但在整個系統中可以加起來)每個proc每運行一次,如果一個系統進程以相同的名字結束,它將使用它而不是你的。

+0

我已經研究過如何用桌子的想法來描述,但這需要很長時間才能發展。另一個說明,存儲過程應該以什麼開始,以便一個人(開發人員)很容易理解它是一個存儲過程?有沒有最佳做法? – jp2code 2012-07-19 23:29:53

+2

很多人使用USP_,代表UserStoredProcedure – HLGEM 2012-07-20 13:32:49