web-dev-qa-db-ja.com

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 Server2005を使用しています。

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

これにより、計算された列が保持され、レコードが多数ある場合は、ビューまたはUDFでの計算よりも選択でパフォーマンスが向上する可能性があります(列の最初の作成が行われると、非常に遅くなる可能性があり、使用時間が少ないときに発生する可能性があります)。挿入と更新が遅くなります。通常、ロックの問題が発生しない限り、遅い挿入または更新は、選択の遅延よりもユーザーの方が許容できると思います。

これを行うための最良の方法は、使用法と必要なパフォーマンスの種類に大きく依存します。多くのレコードがない場合、または計算列がそれほど頻繁に呼び出されない場合は、永続化された列は必要ないかもしれませんが、その年のすべてのレコードまたはその他の大規模なセットを含むレポートを頻繁に実行している場合データの場合、永続化された計算列の方が適している場合があります。この種のタスクと同様に、状況で何が最も効果的かを知る唯一の方法はテストすることです。

26
HLGEM

これは、ビューの優れた候補です。

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
8
p.campbell
ALTER TABLE ACCOUNT_TABLE ADD ACCT_NUMBER AS MAIN_ACCT+'-'+GROUP_ACCT+'-'+SUB_ACCT;

列はテーブルに永続化されず、参照するたびにオンザクライで再作成されます。ビューを使用しても同じ結果を得ることができます。計算列でフィルタリング述語または順序付けを使用していて、それにインデックスを追加する場合は、 計算列でのインデックスの作成 を参照してください。

5
Remus Rusanu

そうですね、ACCOUNT_TABLEのビューを作成して、それをクエリすることができます。または、同じことを実行するユーザー定義関数を作成できると思います。

3
DavidStein