2009-08-13 4 views
14

J'ai une table avec plusieurs champs de compte comme celui-ci:Comment puis-je configurer un champ calculé simple dans SQL Server?

MAIN_ACCT 
GROUP_ACCT 
SUB_ACCT 

J'ai souvent besoin de les combiner comme ceci:

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

Je voudrais un champ calculé qui fait automatiquement, alors je peut juste dire:

SELECT ACCT_NUMBER FROM ACCOUNT_TABLE 

Quelle est la meilleure façon de le faire?

J'utilise SQL Server 2005.

Répondre

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

Cela persistera une colonne calculée et peut effectuer mieux sélectionner qu'un calcul en vue ou UDF si vous avez un grand nombre d'enregistrements (une fois la création intial de la colonne est arrivé qui peut être douloureusement lent et devrait probablement se produire pendant les périodes de faible utilisation). Cela ralentira les insertions et les mises à jour. Habituellement, je trouve qu'une insertion lente ou une mise à jour est mieux tolérée par les utilisateurs qu'un retard dans une sélection, sauf si vous avez des problèmes de verrouillage. La meilleure méthode pour ce faire dépendra beaucoup de votre utilisation et du type de performance dont vous avez besoin. Si vous n'avez pas beaucoup d'enregistrements ou si la colonne calculée ne sera pas appelée fréquemment, vous pouvez ne pas vouloir une colonne persistante, mais si vous exécutez fréquemment des rapports avec tous les enregistrements pour l'année ou d'autres grands ensembles de données, vous pouvez trouver la colonne calculée persistante fonctionne mieux pour vous. Comme pour toute tâche de cette nature, la seule façon de savoir ce qui fonctionne le mieux dans votre situation est de tester.

+0

Super, utile encore pour moi quelques années plus tard. – enderland

3

Eh bien, vous pouvez créer une vue de la ACCOUNT_TABLE et requête. Ou je crois que vous pourriez créer une fonction définie par l'utilisateur qui accomplirait la même chose.

8

Ceci est un excellent candidat pour une vue.

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

Pouce. Doit m'a battu par secondes. hey – DavidStein

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

la colonne ne persistent pas dans le tableau, sera recréée sur le CLY chaque fois que vous référencez. Vous pouvez obtenir le même résultat en utilisant une vue. Si vous utilisez des prédicats ou un ordre de filtrage sur la colonne calculée et souhaitez y ajouter un index, voir Creating Indexes on Computed Columns.

+2

Vous pouvez persister la colonne et ne pas passer le temps à recalculer ce que vous auriez à faire dans une vue. Nous persistons les nôtres parce que le léger retard quand les données sont changées est bien meilleur que le long délai chaque fois que nous voulons interroger l'information. Vous pouvez également indexer la colonne si elle est persistante. – HLGEM

+0

Tant que vous connaissez la colonne persistante lors de la maintenance du projet. Si ce n'est pas le cas, les problèmes peuvent survenir. – Coops

Questions connexes