Angeben von berechneten Spalten in einer Tabelle
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Eine berechnete Spalte ist eine virtuelle Spalte, die nicht physisch in der Tabelle gespeichert ist, es sei denn, die Spalte wurde als PERSISTED
markiert. Der Ausdruck für eine berechnete Spalte kann aus Daten anderer Spalten einen Wert für die Spalte berechnen, der er zuwiesen ist. Sie können mithilfe von SQL Server Management Studio (SSMS) oder Transact-SQL (T-SQL) einen Ausdruck für eine berechnete Spalte in SQL Server angeben.
Begrenzungen
Eine berechnete Spalte kann nicht als
DEFAULT
oderFOREIGN KEY
-Einschränkungsdefinition oder mit einerNOT NULL
-Einschränkungsdefinition verwendet werden. Eine berechnete Spalte kann jedoch als Schlüsselspalte in einem Index oder als Teil einerPRIMARY KEY
- oderUNIQUE
-Einschränkung verwendet werden, wenn der Wert der berechneten Spalte durch einen deterministischen Ausdruck definiert ist und der Datentyp des Ergebnisses in Indexspalten zulässig ist.Wenn eine Tabelle beispielsweise die beiden ganzzahligen Spalten
a
undb
enthält, kann für eine berechnete Spalte, die alsa + b
definiert ist, ein Index erstellt werden. Für die berechnete Spalte, die alsa + DATEPART(dd, GETDATE())
definiert ist, ist dies jedoch nicht möglich, da sich der Wert in späteren Aufrufen möglicherweise ändert.Eine berechnete Spalte kann nicht das Ziel einer INSERT- oder UPDATE-Anweisung sein.
SET QUOTED_IDENTIFIER
muss aufON
festgelegt sein, wenn Indizes für berechnete Spalten oder indizierte Sichten erstellt oder geändert werden. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).
Berechtigungen
Erfordert die ALTER-Berechtigung für die Tabelle.
Verwenden von SQL Server Management Studio
Fügen Sie eine neue berechnete Spalte hinzu
Erweitern Sie in Objekt-Explorerdie Tabelle, der Sie die neue berechnete Spalte hinzufügen möchten. Klicken Sie mit der rechten Maustaste auf Spalten , und wählen Sie Neue Spalteaus.
Geben Sie den Spaltennamen ein, und akzeptieren Sie den Standarddatentyp (nchar(10)). Datenbank-Engine ermittelt den Datentyp der berechneten Spalte, indem die Regeln zur Rangfolge von Datentypen auf Ausdrücke angewendet werden, die in der Formel angegeben wurden. Wenn die Formel beispielsweise auf eine Spalte vom Typ money und eine Spalte vom Typ intverweist, weist die berechnete Spalte den Typ money auf, da dieser Datentyp die höhere Rangfolge hat. Weitere Informationen finden Sie unter Rangfolge der Datentypen (Transact-SQL).
Erweitern Sie auf der Registerkarte Spalteneigenschaften die BerechneteSpalteSpezifikation -Eigenschaft.
Geben Sie für die untergeordnete Eigenschaft (Formel) in der Datenblattzelle auf der rechten Seite den Ausdruck für diese Spalte ein. In einer
SalesTotal
-Spalte kann die eingegebene Formel z. B.SubTotal+TaxAmt+Freight
lauten, wodurch für jede Tabellenzeile der Wert in diesen Spalten hinzugefügt wird.Wichtig
Wenn in einer Formel zwei Ausdrücke verschiedener Datentypen kombiniert sind, geben die Rangfolgeregeln für Datentypen an, dass der Datentyp mit der niedrigeren Rangfolge in den Datentyp mit der höheren Rangfolge konvertiert wird. Wenn es sich bei der Konvertierung nicht um eine unterstützte implizite Konvertierung handelt, wird der Fehler „
Error validating the formula for column column_name.
“ zurückgegeben. Verwenden Sie dieCAST
-Funktion oderCONVERT
-Funktion, um den Datentypkonflikt aufzulösen. Wenn beispielsweise eine Spalte vom Typ nvarchar mit einer Spalte vom Typ intkombiniert wird, muss der ganzzahlige Typ in nvarchar konvertiert werden, wie in der folgenden Formel('Prod'+CONVERT(nvarchar(23),ProductID))
dargestellt. Weitere Informationen finden Sie unter CAST und CONVERT (Transact-SQL).Geben Sie an, ob die Daten persistent gespeichert werden sollen, indem Sie im Dropdownfeld für die untergeordnete Eigenschaft IsPersisted die Option Ja oder Nein wählen.
Klicken Sie im Menü Datei auf Speichern Tabellenname.
Fügen Sie einer vorhandenen Spalte die Definition einer berechneten Spalte hinzu
- Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Tabelle mit der Spalte, für die Sie den Ordner Spalten ändern und erweitern möchten.
- Klicken Sie mit der rechten Maustaste auf die Spalte, für die Sie die Formel einer berechneten Spalte angeben möchten, und klicken Sie auf Löschen. Wählen Sie OK aus.
- Fügen Sie eine neue Spalte hinzu, und geben Sie die Formel der berechneten Spalte an, indem Sie die vorangehenden Schritte ausführen, um eine neue berechnete Spalte hinzuzufügen.
Verwenden von Transact-SQL
Fügen Sie eine berechnete Spalte beim Erstellen einer Tabelle hinzu
Im folgenden Beispiel wird eine Tabelle mit einer berechneten Spalte erstellt, die den Wert in der Spalte QtyAvailable
mit dem Wert in der Spalte UnitPrice
multipliziert.
CREATE TABLE dbo.Products
(
ProductID int IDENTITY (1,1) NOT NULL
, QtyAvailable smallint
, UnitPrice money
, InventoryValue AS QtyAvailable * UnitPrice
);
-- Insert values into the table.
INSERT INTO dbo.Products (QtyAvailable, UnitPrice)
VALUES (25, 2.00), (10, 1.5);
-- Display the rows in the table.
SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue
FROM dbo.Products;
-- Update values in the table.
UPDATE dbo.Products
SET UnitPrice = 2.5
WHERE ProductID = 1;
-- Display the rows in the table, and the new values for UnitPrice and InventoryValue.
SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue
FROM dbo.Products;
Fügen Sie einer vorhandenen Tabelle eine neue berechnete Spalte hinzu
Im folgenden Beispiel wird der im vorangehenden Beispiel erstellten Tabelle eine neue Spalte hinzugefügt.
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);
Fügen Sie optional das PERSISTED-Argument hinzu, um die berechneten Werte physisch in der Tabelle zu speichern:
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5) PERSISTED;
Ändern Sie eine vorhandene Spalte in eine berechnete Spalte
Im folgenden Beispiel wird die im vorangehenden Beispiel hinzugefügte Spalte geändert.
ALTER TABLE dbo.Products DROP COLUMN RetailValue;
GO
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);
GO