2016-02-12 49 views
0

這是現有的應用程序,它具有約1400〜存儲過程,這是很多年前建成。我們使用GetDate()在許多存儲過程中獲取當前日期。SQL服務器GETDATE函數返回一個將來的日期

現在我們要測試與「老化」場景此應用程序。我們被DBA告知,GetDate()函數從操作系統派生日期。所以如果我們需要getdate()來返回將來的日期,我們需要更改OS日期。數據中心人員不會讓我們更改操作系統日期。

一個顯而易見的解決方案是創建一個單獨的GetApplicationDate()函數返回什麼都日期,我們希望和審查所有的存儲過程,並用這個新的自定義功能進行更新。

我想避免更改〜1400的存儲過程,並覆蓋GETDATE SQL Server提供()函數。那可能嗎?

感謝, 加亞

+2

你的DBA是正確的。找人重寫「數據中心人員」並節省您的工作時間。但是,請記住,OS日期是當地的 - 所以,如果你是在西部成本(或印度),或在以往任何時候,未來的時間可能是一個本地化的改變一樣簡單。 – Hogan

+0

NO。 GetDate返回當前系統日期時間。它是在SQL Server中的本地代碼,所以你不能改變它。對於這種類型的測試,你將不得不改變當前的系統時間。 –

+0

同意以前的2條評論。如果您不需要手術,並且可以用您的自定義功能替換每次發生GETDATE(),那麼可以使用複製/替換工具快速完成,或者更新到系統表。 –

回答

0

也有同樣的問題在這裏Changing the output of Getdate和它幾乎指出,這是不可能改變的值GETDATE返回不是改變O/S的時間等。你可以考慮的是通過用一個包裝器或日期時間提供器代替getdate語句來修改所有的存儲過程,你可以控制它返回的值,偏移量等等。這可以通過將日期或偏移量放置在包裝器引用的表中進行控制,以便您只需在一個位置將其更改即可。

另一件事你可以考慮,如果這是一個大的工作(由於需要變更對象的數量)會以編程方式(自動)進行的更改的所有對象。谷歌在如何做到這一點上有不少點擊。

0

看起來你終於到達了沒有更多的機會不重構你的源代碼中的點。此外,我認爲<date>必須是您存儲過程的參數。
也許你有一些理由來獲得同樣在整個系統內SP的日期,在這種情況下,改變引用到一個新的功能看起來合理。

要避免每次SP「舉手」的修改,你可以通過文件運行在您的硬盤上,並取代getgate()到一個新的FUNC名正則表達式腳本修改。如果你在vcs中存儲sql-code。或者通過t-sql腳本使用sys.sql_modules->definition數據。這意味着你可以編程生成新的sp的內容。但你必須小心。

你也應該記住,

  • 當前日期仍可能在你的存儲特效地方需要
  • 通過新的功能恢復可能會導致性能
  • 變更日期發出
  • 新的功能必須是確定性否則可能會導致額外的性能問題
相關問題