2009-08-13 5 views
14

Ich habe eine Tabelle mit mehreren Konto Felder wie folgt aus:Wie kann ich ein einfaches berechnetes Feld in SQL Server einrichten?

MAIN_ACCT 
GROUP_ACCT 
SUB_ACCT 

Ich muss oft sie wie folgt kombinieren:

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

ich ein berechnetes Feld möchten, dass dies automatisch tut, so dass ich kann nur sagen:

SELECT ACCT_NUMBER FROM ACCOUNT_TABLE 

Was ist der beste Weg, dies zu tun?

Ich bin mit SQL Server 2005.

Antwort

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

Dies wird eine berechnete Spalte bestehen bleiben und in wählt als eine Berechnung im Hinblick oder UDF besser ausführen können, wenn Sie eine große Anzahl von Datensätzen haben (wenn die intial Schaffung der Säule, die quälend langsam sein kann, ist geschehen und sollte wahrscheinlich während geringer Nutzungszeiten passieren). Es wird Einfügungen und Aktualisierungen verlangsamen. Normalerweise finde ich, dass eine langsame Einfügung oder Aktualisierung von den Benutzern besser toleriert wird als eine Verzögerung in einer Auswahl, es sei denn, Sie erhalten Sperrprobleme.

Die beste Methode, um dies zu tun, hängt stark von Ihrer Verwendung und von der Art der Leistung ab, die Sie benötigen. Wenn Sie nicht viele Datensätze haben oder wenn die berechnete Spalte nicht häufig aufgerufen wird, möchten Sie möglicherweise keine persistente Spalte, aber wenn Sie häufig Berichte mit allen Datensätzen für das Jahr oder andere große Datensätze ausführen Daten, können Sie finden, dass die beibehaltene berechnete Spalte besser für Sie arbeitet. Wie bei jeder Aufgabe dieser Art ist der einzige Weg zu wissen, was in Ihrer Situation am besten funktioniert, der Test.

+0

Großartig, hilfreich noch ein paar Jahre später für mich. – enderland

3

Nun, könnten Sie einen Blick auf den ACCOUNT_TABLE erstellen und abfragen. Oder ich glaube, dass Sie eine benutzerdefinierte Funktion erstellen könnten, die das gleiche erreichen würde.

8

Dies ist ein großartiger Kandidat für eine Ansicht.

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

Ugh. Muss mich in Sekunden geschlagen haben. heh – DavidStein

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

die Spalte in der Tabelle nicht beibehalten wird, on-the-cly jeder Sie es Referenzzeit neu erstellt werden. Sie können dasselbe Ergebnis erzielen, indem Sie eine Ansicht verwenden. Wenn Sie für die berechnete Spalte Filterprädikate oder -reihenfolgen verwenden und einen Index hinzufügen möchten, finden Sie weitere Informationen unter Creating Indexes on Computed Columns.

+2

Sie können die Spalte persistieren und nicht die Zeit damit verbringen, neu zu berechnen, was Sie in einer Ansicht tun müssten. Wir bleiben bestehen, weil die leichte Verzögerung, wenn die Daten geändert werden, weit besser ist als die lange Verzögerung, wann immer wir die Information abfragen wollen. Sie können die Spalte auch indizieren, wenn sie beibehalten wird. – HLGEM

+0

Solange Sie die persistente Spalte kennen, wenn Sie Wartungsarbeiten am Projekt durchführen. Wenn das nicht der Fall ist, können Probleme auftreten. – Coops