2016-04-23 83 views
2

SQL表具有類型爲NVARCHAR(MAX)的列,其中包含客戶狀態的歷史記錄。在StatusHistory列的值SQL Server:高級計算列公式

例子:

20120401P,20140715A,20160118T 

含義:

  • 2012年4月1,客戶被待定
  • 2015年7月15日的客戶開始活躍
  • 1月18日,2016客戶被終止

狀態將始終按照時間順序升序排列!

在該表中,我有一個名爲CustStatus中,我想通過上述基於GETDATE()閱讀StatusHistory列來存儲當前客戶狀態列。

目前我正在使用用戶定義函數的CustStatus中的公式執行此操作。

我可能是錯的,但我認爲如果我可以做到這一點而不使用用戶定義的函數,我可以提高查詢的性能,包括這些信息。

那麼,會不會有一個公式讓我可以根據GETDATE()StatusHistory填充CustStatus

+5

這是一個**糟糕的設計!**不要浪費你的時間來處理這個問題 - 你需要**修復你的設計!**。您應該有一個具有當前狀態的「客戶」表格和一個引用「客戶」表格的單獨的「CustomerHistory」表格,幷包含日期和狀態的列。有了這樣一個**正確的關係**設置,查詢將是一件輕而易舉的事! –

+0

**爲什麼我不斷得到答案,如果我的問題是「設計是否好?」**。這不是我問的!所以我想沒有人知道如何去做。 –

+1

@FrankM。,因爲回答你的實際問題將鼓勵你繼續使用它:) –

回答

1

設計很糟糕。但是,根據您的要求假設你有沒有前途的狀態,你可以得到最近的狀態非常簡單:

select right(StatusHistory, 1) as CurrentStatus 

我強烈,你應該修復設計,並有一個CustomerStatusHistory表marc_s同意妥善保管。但是,如果您無法修復數據結構,至少可以幫助您獲取所需的信息。

注意:使用right()通常比用戶定義的函數快得多。

+0

感謝您的回覆至今。首先,字符串可能會收到未來的狀態。此外,我確實有一個單獨的狀態表,並且我試圖找到一種替代方法,以避免每次需要檢索給定日期的狀態時讀取該表。如果我打印帶有通過日期的報告,我希望報告能夠反映當天的狀態,如果我打印的是同一份報告,請在今天或發佈日期。 –

+0

當然,必須有更好的方法來做到這一點,同時提高查詢的性能。打開任何建議。 –