2009-08-13 49 views
14

我有一個表與幾個帳戶領域是這樣的:如何在SQL Server中設置簡單的計算字段?

MAIN_ACCT 
GROUP_ACCT 
SUB_ACCT 

我經常需要他們這樣的組合:

SELECT MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT 
FROM ACCOUNT_TABLE 

我想計算的字段是自動完成這一點,所以我可以說:

SELECT ACCT_NUMBER FROM ACCOUNT_TABLE 

這樣做的最好方法是什麼?

我使用的是SQL Server 2005中

回答

25
ALTER TABLE ACCOUNT_TABLE 
ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT PERSISTED 

這將持續計算的列並且如果您有大量記錄(一旦INTIAL創建列的發生可以是痛苦的緩慢比視圖或UDF計算在選擇更好的表現,應該在低使用時間內發生)。它會減慢插入和更新。通常情況下,我發現用戶可以更好地容忍插入緩慢或更新,而不是選擇延遲,除非遇到鎖定問題。

這樣做的最好方法將取決於您的使用情況以及您需要哪種性能。如果您沒有很多記錄,或者計算的列不會經常被調用,那麼您可能不需要持久列,但是如果您經常運行包含年度所有記錄或其他大型記錄的報告數據,您可能會發現持續計算的列對您更好。和任何這種性質的任務一樣,要知道什麼是最適合你的情況的唯一方法就是測試。

+0

好幾年以後,我仍然對我很有幫助。 – enderland

3

嗯,你可以創建ACCOUNT_TABLE的觀點和查詢這一點。或者我相信你可以創建一個用戶定義的函數來完成同樣的事情。

8

這是一個偉大的候選人的觀點。

CREATE VIEW vwACCOUNT_TABLE 
AS 

SELECT MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT AS ACCT_NUMBER 
FROM ACCOUNT_TABLE 

GO 

--now select from the View 
SELECT ACCT_NUMBER FROM vwACCOUNT_TABLE 
+0

呃。一定會在幾秒鐘內打敗我。 heh – DavidStein

5
ALTER TABLE ACCOUNT_TABLE ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT; 

該列表中沒有堅持,將在最CLY你引用它每次都重新創建。您可以通過使用視圖來獲得相同的結果。如果您使用過濾謂詞或在計算列上進行排序並希望在其上添加索引,請參閱Creating Indexes on Computed Columns

+2

你可以堅持這一專欄,而不是花時間重新計算你在視圖中必須做的事情。我們堅持我們的觀點,因爲數據改變時的輕微延遲遠遠好於我們想要查詢信息的長延遲。您也可以對列進行索引(如果持續存在) – HLGEM

+0

只要您在項目維護時意識到持續列。如果你不是,那麼這就是可能發生問題的地方。 – Coops

相關問題