UPDATE (Transact-SQL)

Ändert vorhandene Daten in einer Tabelle oder Sicht.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen


[ WITH <common_table_expression> [...n] ]
UPDATE 
    [ TOP ( expression ) [ PERCENT ] ] 
    { <object> | rowset_function_limited 
     [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
    }
    SET 
        { column_name = { expression | DEFAULT | NULL }
          | { udt_column_name.{ { property_name = expression 
                                | field_name = expression } 
                               | method_name ( argument [ ,...n ] ) 
                              } 
            }
          | column_name { .WRITE ( expression , @Offset , @Length ) }
          | @variable = expression 
          | @variable = column = expression [ ,...n ] 
        } [ ,...n ] 
    [ <OUTPUT Clause> ]
    [ FROM{ <table_source> } [ ,...n ] ] 
    [ WHERE { <search_condition> 
            | { [ CURRENT OF 
                  { { [ GLOBAL ] cursor_name } 
                      | cursor_variable_name 
                  } 
                ]
              }
            } 
    ] 
    [ OPTION ( <query_hint> [ ,...n ] ) ]
[ ; ]

<object> ::=
{ 
    [ server_name . database_name . schema_name . 
    | database_name .[ schema_name ] . 
    | schema_name .
    ]
        table_or_view_name}

WITH <common_table_expression>

Gibt den temporären Resultset- oder Sichtnamen an, der auch als allgemeiner Tabellenausdruck (CTE, Common Table Expression) bezeichnet wird und innerhalb der UPDATE-Anweisung definiert ist. Das CTE-Resultset wird aus einer einfachen Abfrage abgeleitet. Die UPDATE-Anweisung verweist auf dieses Resultset.

Allgemeine Tabellenausdrücke können auch mit den Anweisungen SELECT, INSERT, DELETE und CREATE VIEW verwendet werden. Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).

TOP ( expression ) [ PERCENT ]

Gibt die Anzahl oder den Prozentsatz Zeilen an, die aktualisiert werden. expression kann entweder eine Anzahl oder ein Prozentsatz der Zeilen sein.

Die Zeilen, auf die im TOP-Ausdruck für die Anweisung INSERT, UPDATE oder DELETE verwiesen wird, sind nicht auf bestimmte Weise angeordnet.

Klammern, die expression in TOP begrenzen, sind in INSERT-, UPDATE- und DELETE-Anweisungen erforderlich. Weitere Informationen finden Sie unter TOP (Transact-SQL).

server_name

Der Name des Servers (mithilfe eines Verbindungsservernamens oder der OPENDATASOURCE-Funktion als Servername), auf dem sich die Tabelle oder die Sicht befindet. Wenn server_name angegeben wird, sind database_name und schema_name erforderlich.

database_name

Der Name der Datenbank.

schema_name

Der Name des Schemas, zu dem die Tabelle oder Sicht gehört.

table_or view_name

Der Name der Tabelle oder Sicht, aus der die Zeilen aktualisiert werden sollen.

In ihrem Gültigkeitsbereich kann eine table-Variable als Tabellenquelle in einer UPDATE-Anweisung verwendet werden.

Die Sicht, auf die table_or_view_name verweist, muss aktualisierbar sein und auf genau eine Basistabelle in der FROM-Klausel der Sicht verweisen. Weitere Informationen zu aktualisierbaren Sichten finden Sie unter CREATE VIEW (Transact-SQL).

rowset_function_limited

Die Funktion OPENQUERY oder OPENROWSET, die der Funktionalität des Anbieters unterliegt. Weitere Informationen zur Funktionalität, die der Anbieter benötigt, finden Sie unter UPDATE- und DELETE-Anforderungen für OLE DB-Anbieter.

WITH ( <Table_Hint_Limited> )

Gibt einen oder mehrere Tabellenhinweise an, die für eine Zieltabelle zulässig ist. Das WITH-Schlüsselwort und die Klammern sind erforderlich. NOLOCK und READUNCOMMITTED sind nicht zulässig. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweis (Transact-SQL).

SET

Gibt die Liste der zu aktualisierenden Spalten- oder Variablennamen an.

column_name

Eine Spalte, die die zu ändernden Daten enthält. column_name muss in table_or view_name vorhanden sein. Identitätsspalten können nicht aktualisiert werden.

expression

Eine Variable, ein Literalwert, ein Ausdruck oder eine SELECT-Anweisung als Unterabfrage in Klammern, die bzw. der einen einzigen Wert zurückgibt. Der von expression zurückgegebene Wert ersetzt den vorhandenen Wert in column_name oder @variable.

DEFAULT

Gibt an, dass der vorhandene Wert in der Spalte durch den für die Spalte definierten Standardwert ersetzt werden soll. Damit kann auch die Spalte auf NULL geändert werden, wenn diese keinen Standard aufweist und NULL-Werte zulässt.

udt_column_name

Eine benutzerdefinierte Spalte.

property_name | field_name

Member einer öffentlichen Eigenschaft oder öffentlicher Daten eines benutzerdefinierten Typs.

method_name ( argument [ ,... n] )

Eine nicht statische, öffentliche Mutatormethode von udt_column_name, die ein oder mehrere Argumente umfassen kann.

.WRITE ( expression, @Offset , @Length )

Gibt an, dass ein Abschnitt des Wertes von column_name geändert werden soll. expression ersetzt @Length-einheiten, beginnend mit @Offset von column_name. Nur Spalten des Typs varchar(max), nvarchar(max) oder varbinary(max) können mit dieser Klausel angegeben werden. column_name darf nicht NULL sein und kann nicht mit einem Tabellennamen oder Tabellenalias qualifiziert werden.

expression ist der Wert, der in column_name kopiert wird. expression muss in den column_name-Typ ausgewertet werden oder implizit umgewandelt werden können. Wenn expression auf NULL festgelegt wird, wird @Length ignoriert, und der Wert in column_name wird am angegebenen @Offset abgeschnitten.

@Offset ist der Startpunkt im Wert von column_name, an dem expression geschrieben wird. @Offset ist eine auf Null basierende Ordnungsposition, vom Typ bigint und darf keine negative Zahl sein. Wenn @Offset NULL ist, hängt der Aktualisierungsvorgang expression am Ende des vorhandenen column_name-Wertes an, und @Length wird ignoriert. Falls @Offset größer als die Länge von column_name ist, gibt Microsoft SQL Server 2005-Datenbankmodul einen Fehler zurück. Wenn @Offset zuzüglich @Length das Ende des zugrunde liegenden Wertes in der Spalte übersteigt, findet der Löschvorgang bis zum letzten Zeichen des Wertes statt. Wenn @Offset zuzüglich LEN(expression) größer als die zugrunde liegende deklarierte Größe ist, wird ein Fehler ausgelöst.

@Length ist die Länge des Abschnitts in der Spalte, beginnend mit @Offset, der durch expression ersetzt wird. @Length ist vom Typ bigint und darf keine negative Zahl sein. Wenn @Length NULL ist, entfernt der Aktualisierungsvorgang alle Daten aus @Offset bis zum Ende des column_name-Wertes.

Weitere Informationen finden Sie in den Hinweisen.

@variable

Eine deklarierte Variable, die auf den von expression zurückgegebenen Wert festgelegt wird.

SET @variable = column = expression legt die Variable auf denselben Wert wie die Spalte fest. Diese Anweisung unterscheidet sich von SET @variable = column, column = expression, wodurch die Variable auf den Wert der Spalte vor der Aktualisierung festgelegt wird.

<OUTPUT_Clause>

Gibt aktualisierte Daten oder Ausdrücke zurück, die darauf als Teil des UPDATE-Vorgangs basieren. Die OUTPUT-Klausel wird nicht in DML-Anweisungen unterstützt, die an Remotetabellen oder -sichten gerichtet sind. Weitere Informationen finden Sie unter OUTPUT-Klausel (Transact-SQL).

FROM <table_source>

Gibt an, dass eine Tabelle, Sicht oder abgeleitete Tabelle als Quelle die Kriterien für den Aktualisierungsvorgang bereitstellen soll. Weitere Informationen finden Sie unter FROM (Transact-SQL).

Wenn das Objekt, das aktualisiert wird, mit dem Objekt in der FROM-Klausel identisch ist und nur ein Verweis auf das Objekt in der FROM-Klausel vorhanden ist, kann ein Objektalias angegeben werden. Wenn das Objekt, das aktualisiert wird, mehrmals in der FROM-Klausel vorhanden ist, darf genau ein Verweis auf das Objekt keinen Tabellenalias angeben. Alle anderen Verweise auf das Objekt in der FROM-Klausel müssen einen Objektalias aufweisen.

Eine Sicht mit einem INSTEAD OF UPDATE-Trigger kann nicht Ziel für eine UPDATE-Anweisung mit einer FROM-Klausel sein.

WHERE

Gibt die Bedingungen an, mit denen die zu aktualisierenden Zeilen eingegrenzt werden. Es gibt zwei Arten von Aktualisierungen, die vom verwendeten WHERE-Klauseltyp abhängen:

  • Gesuchte Aktualisierungen legen eine Suchbedingung fest, der die zu löschenden Zeilen entsprechen müssen.
  • Positionierte Aktualisierungen verwenden die CURRENT OF-Klausel, um einen Cursor anzugeben. Der Aktualisierungsvorgang wird an der aktuellen Position des Cursors ausgeführt.
<search_condition>

Bezeichnet die Bedingung, die erfüllt sein muss, damit die Zeilen aktualisiert werden. Die Suchbedingung kann auch die Bedingung sein, auf der eine Verknüpfung basiert. Es gibt keinen Höchstwert hinsichtlich der Anzahl von Prädikaten in einer Suchbedingung. Weitere Informationen zu Prädikaten und Suchbedingungen finden Sie unter Suchbedingung (Transact-SQL).

CURRENT OF

Gibt an, dass die Aktualisierung an der aktuellen Position des angegebenen Cursors ausgeführt wird.

GLOBAL

Gibt an, dass cursor_name auf einen globalen Cursor verweist.

cursor_name

Der Name des geöffneten Cursors, von dem der Abruf erfolgen soll. Wenn sowohl ein globaler als auch ein lokaler Cursor namens cursor_name vorhanden sind, bezieht sich dieses Argument auf den globalen Cursor, wenn GLOBAL angegeben ist. Andernfalls bezieht es sich auf den lokalen Cursor. Der Cursor muss Aktualisierungen zulassen.

cursor_variable_name

Der Name der Cursorvariablen. cursor_variable_name muss auf einen Cursor verweisen, der Aktualisierungen zulässt.

OPTION ( <query_hint> [ ,... n ] )

Gibt an, dass zum Anpassen der Verarbeitungsart der Anweisung durch Datenbankmodul Hinweise für den Abfrageoptimierer verwendet werden. Weitere Informationen finden Sie unter Abfragehinweis (Transact-SQL).

Die UPDATE-Anweisung wird protokolliert; Teilaktualisierungen von Datentypen mit umfangreichen Werten, die die .WRITE-Klausel verwenden, werden allerdings nur minimal protokolliert. Weitere Informationen finden Sie im Abschnitt "Aktualisieren von Datentypen mit umfangreichen Werten" weiter unten.

UPDATE-Anweisungen sind im Textkörper von benutzerdefinierten Funktionen nur zulässig, wenn es sich bei der Tabelle, die geändert wird, um eine table-Variable handelt.

Wenn die Aktualisierung einer Zeile eine Einschränkung oder Regel verletzt, wenn sie die NULL-Einstellung für die Spalte verletzt, oder wenn der neue Wert einen inkompatiblen Datentyp hat, wird die Anweisung abgebrochen. Außerdem wird ein Fehler zurückgegeben, und es werden keine Datensätze aktualisiert.

Wenn in einer UPDATE-Anweisung ein arithmetischer Fehler (Überlauf, Division durch Null oder Definitionsbereichsfehler/Domänenfehler) bei der Auswertung eines Ausdrucks auftritt, wird die Aktualisierung nicht ausgeführt. Der Rest des Batches wird nicht ausgeführt, und eine Fehlermeldung wird zurückgegeben.

Wenn die Aktualisierung der Spalten eines gruppierten Indexes dazu führt, dass die Größe des gruppierten Index und der Zeile den Wert von 8.060 Byte überschreitet, schlägt die Aktualisierung fehl und eine Fehlermeldung wird zurückgegeben.

Wenn die UPDATE-Anweisung beim Aktualisieren des Gruppierungsschlüssels und einer oder mehrerer text-, ntext- oder image-Spalten nicht mehr als eine Zeile ändern konnte, wird die Teilaktualisierung dieser Spalten als vollständige Ersetzung dieser Werte ausgeführt.

Alle char- und nchar-Spalten werden rechts auf die definierte Länge aufgefüllt.

Die Einstellung für die Option SET ROWCOUNT wird für UPDATE-Anweisungen mit Remotetabellen sowie mit lokal und remote partitionierten Sichten ignoriert.

Wenn ANSI_PADDING auf OFF festgelegt ist, werden alle nachfolgenden Leerzeichen von den in varchar- und nvarchar-Spalten eingefügten Daten entfernt. Dies gilt nicht für Zeichenfolgen, die nur aus Leerzeichen bestehen. Diese Zeichenfolgen werden auf eine leere Zeichenfolge abgeschnitten. Wenn ANSI_PADDING auf ON festgelegt ist, werden nachfolgende Leerzeichen eingefügt. Der Microsoft SQL Server-ODBC-Treiber und der OLE DB-Provider für SQL Server stellen beim Herstellen einer Verbindung SET ANSI_PADDING automatisch auf ON ein. Diese Einstellung kann in ODBC-Datenquellen oder durch Festlegen von Verbindungsattributen oder Verbindungseigenschaften konfiguriert werden. Weitere Informationen finden Sie unter SET ANSI_PADDING (Transact-SQL).

Eine positionierte Aktualisierung, die eine WHERE CURRENT OF-Klausel verwendet, aktualisiert die Einzelzeile an der aktuellen Cursorposition. Dies kann genauer sein als eine gesuchte Aktualisierung, die eine WHERE <search_condition>-Klausel zur Kennzeichnung der zu aktualisierenden Zeilen verwendet. Eine gesuchte Aktualisierung ändert mehrere Zeilen, wenn die Suchbedingung nicht eindeutig eine einzelne Zeile identifiziert.

Verwenden von UPDATE mit der FROM-Klausel

Das Ergebnis einer UPDATE-Anweisung ist nicht definiert, wenn sie nicht deterministisch ist. Dies ist der Fall, wenn die UPDATE-Anweisung eine FROM-Klausel enthält, in der nicht für jedes Vorkommen einer zu aktualisierenden Spalte genau ein Wert verfügbar ist. Beispielsweise erfüllen im folgenden Skript der UPDATE-Anweisung beide Zeilen der Table1-Tabelle die Bedingungen der FROM-Klausel in der UPDATE-Anweisung. Es ist jedoch nicht definiert, welche Zeile von Table1 zum Aktualisieren der Zeile in der Table2.-Tabelle verwendet wird.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
    DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL
    DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1 
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);
GO
CREATE TABLE dbo.Table2 
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES(1, 10.0);
INSERT INTO dbo.Table1 VALUES(1, 20.0);
INSERT INTO dbo.Table2 VALUES(1, 0.0);
GO
UPDATE dbo.Table2 
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2 
    INNER JOIN dbo.Table1 
    ON (dbo.Table2.ColA = dbo.Table1.ColA);
GO
SELECT ColA, ColB 
FROM dbo.Table2;

Dasselbe Problem kann auftreten, wenn die Klauseln FROM und WHERE CURRENT OF kombiniert werden. Im folgenden Beispiel erfüllen beide Zeilen der Table2-Tabelle die Bedingungen der FROM-Klausel in der UPDATE-Anweisung. Es ist jedoch nicht definiert, welche Zeile von Table2 zum Aktualisieren der Zeile in der Table1-Tabelle verwendet wird.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
    DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL
    DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1
    (c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);
GO
CREATE TABLE dbo.Table2
    (d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES (1, 10);
INSERT INTO dbo.Table2 VALUES (1, 20);
INSERT INTO dbo.Table2 VALUES (2, 30);
GO
DECLARE abc CURSOR LOCAL FOR
    SELECT c1, c2 
    FROM dbo.Table1;
OPEN abc;
FETCH abc;
UPDATE dbo.Table1 
SET c2 = c2 + d2 
FROM dbo.Table2 
WHERE CURRENT OF abc;
GO
SELECT c1, c2 FROM dbo.Table1;
GO

Aktualisieren benutzerdefinierter Spalten

Sie können Werte in benutzerdefinierten Spalten auf eine der folgenden Arten aktualisieren:

  • Bereitstellen eines Wertes in einem SQL Server-Systemdatentyp, vorausgesetzt, der benutzerdefinierte Typ unterstützt die implizite oder explizite Konvertierung aus diesem Typ. Im folgenden Beispiel wird gezeigt, wie Sie einen Wert in einer Spalte des benutzerdefinierten Typs Point durch explizites Konvertieren aus einer Zeichenfolge aktualisieren.
    UPDATE Cities
    SET Location = CONVERT(Point, '12.3:46.2')
    WHERE Name = 'Anchorage';
    
  • Aufrufen einer als Mutator markierten Methode des benutzerdefinierten Typs, um die Aktualisierung auszuführen. Im folgenden Beispiel wird eine Mutatormethode des Typs Point namens SetXY aufgerufen. Dadurch wird der Status der Instanz des Typs aktualisiert.
    UPDATE Cities
    SET Location.SetXY(23.5, 23.5)
    WHERE Name = 'Anchorage';
    
    ms177523.note(de-de,SQL.90).gifHinweis:
    Von SQL Server wird ein Fehler zurückgegeben, wenn eine mutator-Methode für einen NULL-Wert von Transact-SQL aufgerufen wird oder wenn ein neuer von einer mutator-Methode generierter Wert NULL ist.

  • Ändern des Wertes eines Members einer öffentlichen Eigenschaft oder öffentlicher Daten des benutzerdefinierten Typs. Der Ausdruck, der den Wert bereitstellt, muss implizit in den Typ der Eigenschaft konvertierbar sein. Im folgenden Beispiel wird der Wert der X-Eigenschaft des benutzerdefinierten Typs Point geändert.
    UPDATE Cities
    SET Location.X = 23.5
    WHERE Name = 'Anchorage';
    
    Wenn Sie verschiedene Eigenschaften einer Spalte des gleichen benutzerdefinierten Typs ändern möchten, geben Sie mehrere UPDATE-Anweisungen aus, oder rufen Sie eine Mutatormethode des Typs auf.

Aktualisieren von Datentypen mit umfangreichen Werten

Verwenden Sie die .WRITE (expression, @Offset, @Length)-Klausel zum Ausführen einer teilweisen oder vollständigen Aktualisierung von varchar(max)-, nvarchar(max)- und varbinary(max)-Datentypen. Bei einer teilweisen Aktualisierung einer varchar(max)-Spalte werden z. B. nur die ersten 200 Zeichen der Spalte gelöscht oder geändert, während bei einer vollständigen Aktualisierung alle Daten in der Spalte gelöscht oder geändert werden. Aktualisierungen mit .WRITE, bei denen neue Daten eingefügt oder angefügt werden, werden minimal protokolliert, wenn das Wiederherstellungsmodell für die Datenbank auf massenprotokolliert oder einfach festgelegt ist. Die minimale Protokollierung wird nicht verwendet, wenn vorhandene Werte aktualisiert werden. Weitere Informationen finden Sie unter Minimal protokollierte Vorgänge.

SQL Server 2005-Datenbankmodul konvertiert eine teilweise Aktualisierung in eine vollständige Aktualisierung, wenn die UPDATE-Anweisung eine dieser Aktionen bewirkt:

  • Ändert eine Schlüsselspalte der partitionierten Sicht oder Tabelle.
  • Ändert mehr als eine Zeile und aktualisiert außerdem den Schlüssel eines nicht eindeutigen gruppierten Indexes in einen nicht konstanten Wert.

Sie können die .WRITE-Klausel nicht zum Aktualisieren einer NULL-Spalte oder zum Festlegen des Wertes von column_name auf NULL verwenden.

@Offset und @Length werden in Byte für varbinary- und varchar-Datentypen und in Zeichen für den nvarchar-Datentyp angegeben. Die geeigneten Offsets werden für Doppelbyte-Zeichensatzsortierungen (DBCS, Double-Byte Character Set) berechnet.

Es wird empfohlen, Daten in Blockgrößen einzufügen bzw. zu aktualisieren, die ein Vielfaches von 8.040 Byte sind, um eine optimale Leistung zu erzielen.

Wenn auf die durch die .WRITE-Klausel geänderte Spalte in einer OUTPUT-Klausel verwiesen wird, wird der vollständige Wert der Spalte (entweder das Anfangsabbild in deleted.column_name oder das Endabbild in inserted.column_name) an die angegebene Spalte in der Tabellenvariablen zurückgegeben. Weitere Informationen finden Sie unten im Beispiel G.

Verwenden Sie STUFF (Transact-SQL), um dieselbe Funktionalität von .WRITE mit anderen Zeichen- oder Binärdatentypen zu erzielen.

Aktualisieren der Spalten text, ntext und image

Durch das Ändern einer Spalte des Datentyps text, ntext oder image mit UPDATE wird die Spalte initialisiert, ein gültiger Textzeiger zugewiesen und mindestens eine Datenseite zugeordnet, es sei denn, die Spalte wird mit NULL aktualisiert.

Wenn Sie große Datenblöcke des Datentyps text, ntext oder image ersetzen oder ändern, verwenden Sie statt der UPDATE-Anweisung die Anweisung WRITETEXT oder UPDATETEXT.

ms177523.note(de-de,SQL.90).gifWichtig:
Die Datentypen ntext, text und image werden in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Datentypen bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen sie aktuell verwendet werden. Verwenden Sie stattdessen nvarchar(max), varchar(max) und varbinary(max). Weitere Informationen finden Sie unter Verwenden von Datentypen mit umfangreichen Werten.

Verwenden von INSTEAD OF-Triggern für UPDATE-Aktionen

Wenn ein INSTEAD-OF-Trigger für UPDATE-Aktionen für eine Tabelle definiert ist, wird der Trigger statt der UPDATE-Anweisung ausgeführt. Frühere Versionen von SQL Server unterstützen nur AFTER-Trigger für UPDATE-Anweisungen und andere Anweisungen zur Datenänderung. Die FROM-Klausel kann nicht in einer UPDATE-Anweisung angegeben werden, die (direkt oder indirekt) auf eine Sicht mit einem dafür definierten INSTEAD OF-Trigger verweist. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).

Festlegen von Variablen und Spalten

Variablennamen können in UPDATE-Anweisungen verwendet werden, um die betroffenen alten und neuen Werte anzuzeigen. Diese Vorgehensweise sollte aber nur angewendet werden, wenn die UPDATE-Anweisung einen einzigen Datensatz betrifft. Betrifft die UPDATE-Anweisung mehrere Datensätze, verwenden Sie die OUTPUT-Klausel, um die alten und neuen Werte für die einzelnen Datensätze zurückzugeben.

Für die Zieltabelle sind UPDATE-Berechtigungen erforderlich. SELECT-Berechtigungen sind zum Aktualisieren der Tabelle ebenfalls erforderlich, wenn die UPDATE-Anweisung eine WHERE-Klausel enthält, oder wenn expression in der SET-Klausel eine Spalte in der Tabelle verwendet.

Die UPDATE-Berechtigungen erhalten standardmäßig Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrollen db_owner und db_datawriter und der Tabellenbesitzer. Mitglieder der Rollen sysadmin, db_owner und db_securityadmin sowie der Tabellenbesitzer können Berechtigungen an andere Benutzer übertragen.

A. Verwenden einer einfachen UPDATE-Anweisung

Im folgenden Beispiel wird gezeigt, welche Auswirkungen es auf alle Zeilen haben kann, wenn keine WHERE-Klausel zum Angeben der zu aktualisierenden Zeile oder Zeilen verwendet wird.

Im folgenden Beispiel werden die Werte in den Spalten Bonus, CommissionPct und SalesQuota für alle Zeilen in der SalesPerson-Tabelle aktualisiert.

USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO

Sie können für eine UPDATE-Anweisung auch berechnete Werte verwenden. Im folgenden Beispiel wird der Wert in der ListPrice-Spalte für alle Zeilen in der Product-Tabelle verdoppelt.

USE AdventureWorks ;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO

B. Verwenden der UPDATE-Anweisung mit einer WHERE-Klausel

Im folgenden Beispiel wird die WHERE-Klausel verwendet, um die zu aktualisierenden Zeilen anzugeben. Adventure Works Cycles verkauft z. B. das Fahrradmodell Road-250 in zwei Farben: rot und schwarz. Die Firma hat entschieden, die Farbe für dieses Modell von Rot in Rot metallic zu ändern. Die folgende Anweisung aktualisiert die Zeilen in der Production.Product-Tabelle für alle roten Road-250-Produkte.

USE AdventureWorks;
GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO

C. Verwenden der UPDATE-Anweisung mit Informationen aus einer anderen Tabelle

Im folgenden Beispiel wird die SalesYTD in der SalesPerson-Tabelle geändert, um die neuesten Verkaufszahlen in der SalesOrderHeader-Tabelle wiederzugeben.

USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
    ON sp.SalesPersonID = so.SalesPersonID
    AND so.OrderDate = (SELECT MAX(OrderDate)
                        FROM Sales.SalesOrderHeader 
                        WHERE SalesPersonID = 
                              sp.SalesPersonID);
GO

Im vorherigen Beispiel wird angenommen, dass nur ein Verkauf für einen angegebenen Verkäufer an einem bestimmten Datum aufgezeichnet wird und Aktualisierungen aktuell sind. Wenn mehr als ein Verkauf für einen angegebenen Verkäufer am selben Tag gespeichert werden kann, funktioniert das gezeigte Beispiel nicht richtig. Das Beispiel wird zwar fehlerlos ausgeführt, jeder SalesYTD -Wert wird jedoch mit nur einem Verkauf aktualisiert. Dies ist unabhängig davon, wie viele Verkäufe an diesem Tag tatsächlich stattgefunden haben. Die Ursache ist darin zu suchen, dass eine einzelne UPDATE-Anweisung dieselbe Zeile nicht zweimal ändern kann.

Wird mehr als ein Verkauf für einen angegebenen Verkäufer am gleichen Tag verzeichnet, müssen alle Verkäufe für jeden Verkäufer wie im folgenden Beispiel in der UPDATE-Anweisung vereinigt werden:

USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + 
    (SELECT SUM(so.SubTotal) 
     FROM Sales.SalesOrderHeader AS so
     WHERE so.OrderDate = (SELECT MAX(OrderDate)
                           FROM Sales.SalesOrderHeader AS so2
                           WHERE so2.SalesPersonID = 
                                 so.SalesPersonID)
     AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID
     GROUP BY so.SalesPersonID);
GO

D. Verwenden von UPDATE mit der TOP-Klausel

Im folgenden Beispiel wird die VacationHours-Spalte um 25 Prozent für 10 zufällige Zeilen in der Employee-Tabelle aktualisiert.

USE AdventureWorks;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO

E. Verwenden von UPDATE mit der OUTPUT-Klausel

Im folgenden Beispiel wird die VacationHours-Spalte in der Employee-Tabelle um 25 Prozent für die ersten 10 Zeilen aktualisiert. Die OUTPUT-Klausel gibt an die @MyTableVar table-Variable den Wert für VacationHours zurück, der vor der Anwendung der UPDATE-Anweisung in der DELETED.VacationHours-Spalte vorhanden ist, und den aktualisierten Wert in der INSERTED.VacationHours-Spalte.

Danach folgen zwei SELECT-Anweisungen, die die Werte in @MyTableVar zurückgeben, sowie die Ergebnisse des Aktualisierungsvorgangs in der Employee-Tabelle. Die Ergebnisse in der INSERTED.ModifiedDate-Spalte weichen von den Werten in der ModifiedDate-Spalte der Employee -Tabelle ab. Das liegt daran, dass der AFTER UPDATE-Trigger, der den Wert von ModifiedDate mit dem aktuellen Datum aktualisiert, für die Employee-Tabelle definiert ist. Die von OUTPUT zurückgegebenen Spalten geben allerdings die Daten vor Auslösen der Trigger wieder. Weitere Beispiele zum Verwenden der OUTPUT-Klausel finden Sie unter OUTPUT-Klausel (Transact-SQL).

USE AdventureWorks;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 
OUTPUT INSERTED.EmployeeID,
       DELETED.VacationHours,
       INSERTED.VacationHours,
       INSERTED.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

F. Verwenden von UPDATE mit der WITH common_table_expression-Klausel

Im folgenden Beispiel wird für alle Mitarbeiter, die ManagerID 12 direkt oder indirekt unterstellt sind, der VacationHours-Wert um 25 Prozent aktualisiert. Der allgemeine Tabellenausdruck gibt eine hierarchische Liste der Mitarbeiter zurück, die ManagerID 12 direkt unterstellt sind, sowie der Mitarbeiter, die diesen Mitarbeitern unterstellt sind, usw. Nur die Spalten werden geändert, die vom allgemeinen Tabellenausdruck zurückgegeben werden. Weitere Informationen zu rekursiven allgemeinen Tabellenausdrücken finden Sie unter Rekursive Abfragen mithilfe von allgemeinen Tabellenausdrücken.

USE AdventureWorks;
GO
WITH DirectReports(EmployeeID, NewVacationHours, EmployeeLevel)
AS
(SELECT e.EmployeeID, e.VacationHours, 1
  FROM HumanResources.Employee AS e
  WHERE e.ManagerID = 12
  UNION ALL
  SELECT e.EmployeeID, e.VacationHours, EmployeeLevel + 1
  FROM HumanResources.Employee as e
  JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
)
UPDATE HumanResources.Employee
SET VacationHours = VacationHours * 1.25
FROM HumanResources.Employee AS e
JOIN DirectReports AS d ON e.EmployeeID = d.EmployeeID;
GO

G. Verwenden von UPDATE mit der .WRITE-Klausel zum Ändern von Daten in einer nvarchar(max)-Spalte

Im folgenden Beispiel wird die .WRITE-Klausel verwendet, um einen Teilwert in DocumentSummary zu aktualisieren, einer nvarchar(max)-Spalte in der Production.Document -Tabelle. Das Wort components wird durch das Wort features ersetzt. Dazu werden das Ersetzungswort, die Anfangsposition (Offset) des zu ersetzenden Wortes in den vorhandenen Daten und die Anzahl von zu ersetzenden Zeichen (Länge) angegeben. In dem Beispiel wird außerdem die OUTPUT-Klausel verwendet, um die Anfangs- und Endabbilder der DocumentSummary -Spalte an die @MyTableVar table-Variable zurückzugeben.

USE AdventureWorks;
GO
DECLARE @MyTableVar table (
    DocumentID int NOT NULL,
    SummaryBefore nvarchar(max),
    SummaryAfter nvarchar(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT INSERTED.DocumentID,
       DELETED.DocumentSummary, 
       INSERTED.DocumentSummary 
    INTO @MyTableVar
WHERE DocumentID = 3 ;
SELECT DocumentID, SummaryBefore, SummaryAfter 
FROM @MyTableVar;
GO

H. Verwenden von UPDATE mit .WRITE zum Hinzufügen und Entfernen von Daten in einer nvarchar(max)-Spalte

In den folgenden Beispielen werden Daten einer nvarchar(max)-Spalte hinzugefügt bzw. daraus entfernt, die einen Wert hat, der zurzeit auf NULL festgelegt ist. Da die .WRITE-Klausel nicht zum Ändern einer NULL-Spalte verwendet werden kann, wird die Spalte zuerst mit temporären Daten aufgefüllt. Anschließend werden diese Daten mithilfe der .WRITE-Klausel durch die richtigen Daten ersetzt. In den zusätzlichen Beispielen werden am Ende des Spaltenwertes Daten angefügt, Daten aus der Spalte (durch Abschneiden) entfernt und schließlich Teildaten aus der Spalte entfernt. Die SELECT-Anweisungen zeigen die Datenänderung an, die von jeder UPDATE-Anweisung generiert wurde.

USE AdventureWorks;
GO
-- Replacing NULL value with temporary data.
UPDATE Production.Document
SET DocumentSummary = N'Replacing NULL value'
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Replacing temporary data with the correct data. Setting @Length to NULL 
-- truncates all existing data from the @Offset position.
UPDATE Production.Document
SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Appending additional data to the end of the column by setting 
-- @Offset to NULL.
UPDATE Production.Document
SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Removing all data from @Offset to the end of the existing value by 
-- setting expression to NULL. 
UPDATE Production.Document
SET DocumentSummary .WRITE (NULL, 56, 0)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Removing partial data beginning at position 9 and ending at 
-- position 21.
UPDATE Production.Document
SET DocumentSummary .WRITE ('',9, 12)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO

I. Verwenden von UPDATE mit OPENROWSET zum Ändern einer varbinary(max)-Spalte

Im folgenden Beispiel wird ein vorhandenes Abbild, das in einer varbinary(max)-Spalte gespeichert ist, durch ein neues Abbild ersetzt. Die OPENROWSET-Funktion wird mit der Option BULK verwendet, um das Abbild in die Spalte zu laden. In diesem Beispiel wird angenommen, dass eine Datei namens Tires.jpg im angegebenen Dateipfad vorhanden ist.

USE AdventureWorks;
GO
UPDATE Production.ProductPhoto
SET ThumbNailPhoto = (
    SELECT *
    FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB)AS x )
WHERE ProductPhotoID = 1;
GO

Community-Beiträge

HINZUFÜGEN
Anzeigen: