我有一個TSQL視圖。除了幾列以外,它非常基本,它只是簡單地進行一些連接,然後將所有東西粘合在一起,以呈現應有的美觀。然而,幾個不那麼簡單的列使得視圖代碼很難擴展,現在新的需求已經出現,使複雜的列的業務邏輯無效。A(T)包含太多業務邏輯的Sql視圖
沒有去過多細說,有我在數據庫中的表:
tblEmployment
這包括「外水」的行。每次連續列的任何,對於給定的就業變化(假設的employmentTitle
變化),那麼當前行推入另一個表tblEmploymentHistory
,並在tblEmployment
該行更改,因此它包含了最新的employmentTitle
。
本質上,該視圖所做的是,它試圖加入tblEmployment
tblEmploymentHistory
與唯一EmploymentIdentifier
,這是有道理的。
視圖中更復雜的列將嘗試通過從它已連接在一起的行(即從tblEmployment and tblEmploymentHistory
)進行各種計算來計算一個數(每個行爲elapsedTime
)。爲了獲得經過的時間,它基於口述的業務邏輯來執行計算,例如,只有歷史記錄表中的特定日期時間列應該計算在總時間間隔內,並且只有當該行中的其他列設置爲特定值時才應該這樣做。
現在新的要求已經出現,業務邏輯很多比以前更復雜。我發現很難擴展視圖來包含它,因爲它變得非常混亂,我認爲這可以在業務邏輯的其他部分所在的應用程序層更加結構化地完成!
是否「正確」廢棄視圖,而是將其移動到我的應用程序的應用程序層?顯然,通過觀點得到的好處是速度很快,並且在代碼中對大約100.000行進行計算需要一些時間。但是,可以通過過濾行來使其數量在10.000左右進行優化。
什麼是「標準」和解決這個問題的最乾淨的方法?
爲什麼一個視圖而不是一個存儲過程? – Paolo
@Paolo我不知道。存儲過程是否會成爲這裏的途徑?我自己並沒有創造出這個觀點,我的任務就是擴展它,但這很難做到。如果我使用存儲過程,會更好嗎? – DSF
使用存儲過程可以依賴於CTE和臨時表,imho將極大地簡化您的任務。你沒有分享任何代碼,所以我無法確定,但很可能是這樣。 – Paolo