UPDATE (Transact-SQL)UPDATE (Transact-SQL)

GILT FÜR: jaSQL Server (ab 2008) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Ändert vorhandene Daten in einer Tabelle oder Sicht in SQL Server 2017SQL Server 2017.Changes existing data in a table or view in SQL Server 2017SQL Server 2017. Beispiele finden Sie unter Beispiele.For examples, see Examples.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [...n] ]  
UPDATE   
    [ TOP ( expression ) [ PERCENT ] ]   
    { { table_alias | <object> | rowset_function_limited   
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
      }  
      | @table_variable      
    }  
    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  
          | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression  
        } [ ,...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}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name   
SET { column_name = { expression | NULL } } [ ,...n ]  
[ FROM from_clause ]  
[ WHERE <search_condition> ]   
[ OPTION ( LABEL = label_name ) ]  
[;]  

ArgumenteArguments

WITH <common_table_expression>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.Specifies the temporary named result set or view, also known as common table expression (CTE), defined within the scope of the UPDATE statement. Das CTE-Resultset wird aus einer einfachen Abfrage abgeleitet. Die UPDATE-Anweisung verweist auf dieses Resultset.The CTE result set is derived from a simple query and is referenced by UPDATE statement.

Allgemeine Tabellenausdrücke können auch mit den Anweisungen SELECT, INSERT, DELETE und CREATE VIEW verwendet werden.Common table expressions can also be used with the SELECT, INSERT, DELETE, and CREATE VIEW statements. Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP ( expression) [ PERCENT ]TOP ( expression) [ PERCENT ]
Gibt die Anzahl oder den Prozentsatz der aktualisierten Zeilen an.Specifies the number or percent of rows that are updated. expression kann eine Anzahl oder ein Prozentsatz der Zeilen sein.expression can be either a number or a percent of the rows.

Die Zeilen, auf die im TOP-Ausdruck für die Anweisung INSERT, UPDATE oder DELETE verwiesen wird, sind nicht auf bestimmte Weise angeordnet.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order.

In INSERT-, UPDATE- und DELETE-Anweisungen sind Klammern erforderlich, die expression in TOP begrenzen.Parentheses delimiting expression in TOP are required in INSERT, UPDATE, and DELETE statements. Weitere Informationen finden Sie unter TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

table_aliastable_alias
Der in der FROM-Klausel angegebene Alias, der die Tabelle oder Sicht darstellt, aus der die Zeilen aktualisiert werden sollen.The alias specified in the FROM clause representing the table or view from which the rows are to be updated.

server_nameserver_name
Der Name des Servers (der einen Verbindungsservernamen oder die OPENDATASOURCE-Funktion als Servernamen verwendet), auf dem sich die Tabelle oder die Ansicht befindet.Is the name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. Wenn server_name angegeben ist, sind database_name und schema_name erforderlich.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
Der Name der Datenbank.Is the name of the database.

schema_nameschema_name
Der Name des Schemas, zu dem die Tabelle oder Sicht gehört.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
Der Name der Tabelle oder Sicht, aus der die Zeilen aktualisiert werden sollen.Is the name of the table or view from which the rows are to be updated. Die Ansicht, auf die table_or_view_name verweist, muss aktualisierbar sein und auf genau eine Basistabelle in der FROM-Klausel der Ansicht verweisen.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. Weitere Informationen zu aktualisierbaren Ansichten finden Sie unter CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Die OPENQUERY- oder OPENROWSET-Funktion, die der Funktionalität des Anbieters unterliegt.Is either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <Table_Hint_Limited> )WITH ( <Table_Hint_Limited> )
Gibt mindestens einen Tabellenhinweis an, der für eine Zieltabelle zulässig ist.Specifies one or more table hints that are allowed for a target table. Das WITH-Schlüsselwort und die Klammern sind erforderlich.The WITH keyword and the parentheses are required. NOLOCK und READUNCOMMITTED sind nicht zulässig.NOLOCK and READUNCOMMITTED are not allowed. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweise (Transact-SQL).For information about table hints, see Table Hints (Transact-SQL).

@table_variable@table_variable
Gibt eine table-Variable als Tabellenquelle an.Specifies a table variable as a table source.

SETSET
Gibt die Liste der zu aktualisierenden Spalten- oder Variablennamen an.Specifies the list of column or variable names to be updated.

column_namecolumn_name
Eine Spalte mit Daten, die geändert werden sollten.Is a column that contains the data to be changed. column_name muss in table_or view_name vorhanden sein.column_name must exist in table_or view_name. Identitätsspalten können nicht aktualisiert werden.Identity columns cannot be updated.

expressionexpression
Eine Variable, ein Literalwert, ein Ausdruck oder eine SELECT-Anweisung als Unterabfrage in Klammern, die bzw. der einen einzelnen Wert zurückgibt.Is a variable, literal value, expression, or a subselect statement (enclosed with parentheses) that returns a single value. Der von expression zurückgegebene Wert ersetzt den in column_name oder @variable vorhandenen Wert.The value returned by expression replaces the existing value in column_name or @variable.

Hinweis

In Verweisen auf die Unicodezeichen-Datentypen nchar, nvarchar und ntext muss „expression“ der Großbuchstabe „N“ vorangestellt werden.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Wenn "N" nicht angegeben wird, konvertiert SQL ServerSQL Server die Zeichenfolge in die Codepage, die der Standardsortierung der Datenbank oder Spalte entspricht.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Alle Zeichen, die in der betreffenden Codepage nicht gefunden werden, gehen verloren.Any characters not found in this code page are lost.

DEFAULTDEFAULT
Gibt an, dass der vorhandene Wert in der Spalte durch den für die Spalte definierten Standardwert ersetzt werden soll.Specifies that the default value defined for the column is to replace the existing value in the column. Damit kann auch die Spalte auf NULL geändert werden, wenn diese keinen Standard aufweist und NULL-Werte zulässt.This can also be used to change the column to NULL if the column has no default and is defined to allow null values.

{ += | -= | *= | /= | %= | &= | ^= | |= }{ += | -= | *= | /= | %= | &= | ^= | |= }
Verbundzuweisungsoperator:Compound assignment operator:
+= Addition und Zuweisung+= Add and assign
-= Subtraktion und Zuweisung-= Subtract and assign
*= Multiplikation und Zuweisung*= Multiply and assign
/= Division und Zuweisung/= Divide and assign
%= Modulo und Zuweisung%= Modulo and assign
&= Bitweises AND und Zuweisung&= Bitwise AND and assign
^= Bitweises XOR und Zuweisung^= Bitwise XOR and assign
|= Bitweises OR und Zuweisung|= Bitwise OR and assign

udt_column_nameudt_column_name
Eine benutzerdefinierte Spalte.Is a user-defined type column.

property_name | field_nameproperty_name | field_name
Member einer öffentlichen Eigenschaft oder öffentlicher Daten eines benutzerdefinierten Typs.Is a public property or public data member of a user-defined type.

method_name ( argument [ ,... n] )method_name ( argument [ ,... n] )
Eine nicht statische, öffentliche Mutatormethode von udt_column_name, die mindestens ein Argument umfasst.Is a nonstatic public mutator method of udt_column_name that takes one or more arguments.

. WRITE (expression,@Offset,@Length). WRITE (expression,@Offset,@Length)
Gibt an, dass ein Teil des Werts von column_name geändert werden soll.Specifies that a section of the value of column_name is to be modified. expression ersetzt @Length-Einheiten, beginnend bei @Offset von column_name.expression replaces @Length units starting from @Offset of column_name. Nur Spalten von varchar(max), nvarchar(max) oder varbinary(max) können mit dieser Klausel angegeben werden.Only columns of varchar(max), nvarchar(max), or varbinary(max) can be specified with this clause. column_name darf nicht NULL sein und darf nicht mit einem Tabellennamen oder -alias qualifiziert werden.column_name cannot be NULL and cannot be qualified with a table name or table alias.

expression ist der Wert, der in column_name kopiert wird.expression is the value that is copied to column_name. expression muss in den Typ column_name ausgewertet werden oder implizit umgewandelt werden können.expression must evaluate to or be able to be implicitly cast to the column_name type. Wenn expression auf NULL festgelegt wird, wird @Length ignoriert, und der Wert in column_name wird am angegebenen @Offset abgeschnitten.If expression is set to NULL, @Length is ignored, and the value in column_name is truncated at the specified @Offset.

@Offset ist der Ausgangspunkt im Wert von column_name, an dem expression geschrieben wird.@Offset is the starting point in the value of column_name at which expression is written. @Offset ist eine nullbasierte Ordnungsposition, weist den Datentyp bigint auf und kann keine negative Zahl sein.@Offset is a zero-based ordinal position, is bigint, and cannot be a negative number. Wenn @Offset NULL ist, hängt der Updatevorgang expression am Ende des vorhandenen column_name-Werts an, und @Length wird ignoriert.If @Offset is NULL, the update operation appends expression at the end of the existing column_name value and @Length is ignored. Wenn @Offset größer als die Länge des column_name-Werts ist, gibt Datenbank-EngineDatabase Engine einen Fehler zurück.If @Offset is greater than the length of the column_name value, the Datenbank-EngineDatabase Engine returns an error. Wenn @Offset plus @Length das Ende des zugrunde liegenden Werts in der Spalte überschreitet, findet der Löschvorgang bis zum letzten Zeichen des Werts statt.If @Offset plus @Length exceeds the end of the underlying value in the column, the deletion occurs up to the last character of the value. Wenn @Offset plus LEN(expression) größer als die zugrunde liegende deklarierte Größe ist, wird ein Fehler ausgelöst.If @Offset plus LEN(expression) is greater than the underlying declared size, an error is raised.

@Length ist die Länge des Abschnitts in der Spalte ab @Offset, der von expression ersetzt wird.@Length is the length of the section in the column, starting from @Offset, that is replaced by expression. @Length ist bigint und kann keine negative Zahl sein.@Length is bigint and cannot be a negative number. Wenn @Length NULL ist, entfernt der Updatevorgang alle Daten aus @Offset bis zum Ende des column_name-Werts.If @Length is NULL, the update operation removes all data from @Offset to the end of the column_name value.

Weitere Informationen finden Sie in den Hinweisen.For more information, see Remarks.

@ variable@ variable
Eine deklarierte Variable, die auf den von expression zurückgegebenen Wert festgelegt wird.Is a declared variable that is set to the value returned by expression.

SET @variable = column = expression legt die Variable auf den gleichen Wert wie die Spalte fest.SET @variable = column = expression sets the variable to the same value as the column. Im Gegensatz dazu legt SET @variable = column, column = expression die Variable auf den Wert der Spalte vor dem Update fest.This differs from SET @variable = column, column = expression, which sets the variable to the pre-update value of the column.

<OUTPUT_Clause><OUTPUT_Clause>
Gibt aktualisierte Daten oder Ausdrücke zurück, die darauf als Teil des UPDATE-Vorgangs basieren.Returns updated data or expressions based on it as part of the UPDATE operation. Die OUTPUT-Klausel wird nicht in DML-Anweisungen unterstützt, die an Remotetabellen oder -sichten gerichtet sind.The OUTPUT clause is not supported in any DML statements that target remote tables or views. Weitere Informationen finden Sie unter OUTPUT-Klausel (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

FROM <table_source>FROM <table_source>
Gibt an, dass eine Tabelle, Sicht oder abgeleitete Tabelle als Quelle die Kriterien für den Updatevorgang bereitstellen soll.Specifies that a table, view, or derived table source is used to provide the criteria for the update operation. Weitere Informationen finden Sie unter FROM (Transact-SQL ).For more information, see 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.If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified. Wenn das Objekt, das aktualisiert wird, mehrmals in der FROM-Klausel vorhanden ist, darf genau ein Verweis auf das Objekt keinen Tabellenalias angeben.If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias. Alle anderen Verweise auf das Objekt in der FROM-Klausel müssen einen Objektalias aufweisen.All other references to the object in the FROM clause must include an object alias.

Eine Sicht mit einem INSTEAD OF UPDATE-Trigger kann nicht Ziel für eine UPDATE-Anweisung mit einer FROM-Klausel sein.A view with an INSTEAD OF UPDATE trigger cannot be a target of an UPDATE with a FROM clause.

Hinweis

Jeder Aufruf von OPENDATASOURCE, OPENQUERY oder OPENROWSET in der FROM-Klausel wird einzeln und unabhängig von anderen Aufrufen dieser Funktionen ausgewertet, die als Ziel des Updates verwendet werden, auch wenn für die beiden Aufrufe identische Argumente angegeben werden.Any call to OPENDATASOURCE, OPENQUERY, or OPENROWSET in the FROM clause is evaluated separately and independently from any call to these functions used as the target of the update, even if identical arguments are supplied to the two calls. Insbesondere haben Filter- oder Joinbedingungen, die auf das Ergebnis eines dieser Aufrufe angewendet werden, keine Auswirkungen auf die Ergebnisse des jeweils anderen.In particular, filter or join conditions applied on the result of one of those calls have no effect on the results of the other.

WHEREWHERE
Gibt die Bedingungen an, mit denen die zu aktualisierenden Zeilen eingegrenzt werden.Specifies the conditions that limit the rows that are updated. Es gibt zwei Arten von Updates, die vom verwendeten WHERE-Klauseltyp abhängen:There are two forms of update based on which form of the WHERE clause is used:

  • Gesuchte Updates legen eine Suchbedingung fest, der die zu löschenden Zeilen entsprechen müssen.Searched updates specify a search condition to qualify the rows to delete.

  • Positionierte Updates verwenden die CURRENT OF-Klausel, um einen Cursor anzugeben.Positioned updates use the CURRENT OF clause to specify a cursor. Der Updatevorgang wird an der aktuellen Position des Cursors ausgeführt.The update operation occurs at the current position of the cursor.

<search_condition><search_condition>
Bezeichnet die Bedingung, die erfüllt sein muss, damit die Zeilen aktualisiert werden.Specifies the condition to be met for the rows to be updated. Die Suchbedingung kann auch die Bedingung sein, auf der ein Join basiert.The search condition can also be the condition upon which a join is based. Es gibt keinen Höchstwert hinsichtlich der Anzahl von Prädikaten in einer Suchbedingung.There is no limit to the number of predicates that can be included in a search condition. Weitere Informationen zu Prädikaten und Suchbedingungen finden Sie unter Suchbedingung (Transact-SQL).For more information about predicates and search conditions, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
Gibt an, dass das Update an der aktuellen Position des angegebenen Cursors ausgeführt wird.Specifies that the update is performed at the current position of the specified cursor.

Ein positioniertes Update, das eine WHERE CURRENT OF-Klausel verwendet, aktualisiert die Einzelzeile an der aktuellen Cursorposition.A positioned update using a WHERE CURRENT OF clause updates the single row at the current position of the cursor. Dies kann genauer sein als ein gesuchtes Update, das eine WHERE <<search_condition>-Klausel zur Qualifizierung der zu aktualisierenden Zeilen verwendet.This can be more accurate than a searched update that uses a WHERE <search_condition> clause to qualify the rows to be updated. Mit einem gesuchten Update werden mehrere Zeilen geändert, wenn eine einzelne Zeile durch die Suchbedingung nicht eindeutig identifiziert wird.A searched update modifies multiple rows when the search condition does not uniquely identify a single row.

GLOBALGLOBAL
Gibt an, dass cursor_name auf einen globalen Cursor verweist.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
Der Name des geöffneten Cursors, von dem der Abruf erfolgen soll.Is the name of the open cursor from which the fetch should be made. 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.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. Der Cursor muss Updates zulassen.The cursor must allow updates.

cursor_variable_namecursor_variable_name
Der Name einer Cursorvariablen.Is the name of a cursor variable. cursor_variable_name muss auf einen Cursor verweisen, der Updates zulässt.cursor_variable_name must reference a cursor that allows updates.

OPTION ( <query_hint> [ ,... n ] )OPTION ( <query_hint> [ ,... n ] )
Gibt an, dass mithilfe von Optimierungshinweisen angepasst wird, wie die Anweisung von Datenbank-EngineDatabase Engine verarbeitet wird.Specifies that optimizer hints are used to customize the way the Datenbank-EngineDatabase Engine processes the statement. Weitere Informationen finden Sie unter Abfragehinweise (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Bewährte MethodenBest Practices

Verwenden Sie die Funktion @@ROWCOUNT, um die Anzahl der eingefügten Zeilen an die Clientanwendung zurückzugeben.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Weitere Informationen finden Sie unter @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

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 einzelnen Datensatz betrifft.Variable names can be used in UPDATE statements to show the old and new values affected, but this should be used only when the UPDATE statement affects a single record. 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.If the UPDATE statement affects multiple records, to return the old and new values for each record, use the OUTPUT clause.

Gehen Sie beim Angeben der FROM-Klausel zum Bereitstellen der Kriterien für den Updatevorgang vorsichtig vor.Use caution when specifying the FROM clause to provide the criteria for the update operation. 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.The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. 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 Table2. verwendet wird.For example, in the UPDATE statement in the following script, both rows in Table1 meet the qualifications of the FROM clause in the UPDATE statement; but it is undefined which row from Table1 is used to update the row in Table2.

USE AdventureWorks2012;  
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), (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.The same problem can occur when the FROM and WHERE CURRENT OF clauses are combined. Im folgenden Beispiel erfüllen beide Zeilen der Table2-Tabelle die Bedingungen der FROM-Klausel in der UPDATE-Anweisung.In the following example, both rows in Table2 meet the qualifications of the FROM clause in the UPDATE statement. Es ist jedoch nicht definiert, welche Zeile aus Table2 zum Aktualisieren der Zeile in Table1 verwendet wird.It is undefined which row from Table2 is to be used to update the row in Table1.

USE AdventureWorks2012;  
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), (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  

KompatibilitätsunterstützungCompatibility Support

Die Unterstützung für die Verwendung der READUNCOMMITTED- und NOLOCK-Hinweise in der FROM-Klausel, die sich auf die Zieltabelle einer UPDATE- oder DELETE-Anweisung beziehen, wird in einer zukünftigen Version von SQL ServerSQL Server entfernt.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. Vermeiden Sie die Verwendung dieser Hinweise in diesem Kontext beim Entwickeln neuer Anwendungen, und planen Sie die Änderung von Anwendungen, in denen sie aktuell verwendet werden.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

DatentypenData Types

Alle char- und nchar-Spalten werden rechts auf die definierte Länge aufgefüllt.All char and nchar columns are right-padded to the defined length.

Wenn ANSI_PADDING auf OFF festgelegt ist, werden alle nachfolgenden Leerzeichen aus den in varchar- und nvarchar-Spalten eingefügten Daten entfernt. Dies gilt nicht für Zeichenfolgen, die nur aus Leerzeichen bestehen.If ANSI_PADDING is set to OFF, all trailing spaces are removed from data inserted into varchar and nvarchar columns, except in strings that contain only spaces. Diese Zeichenfolgen werden auf eine leere Zeichenfolge abgeschnitten.These strings are truncated to an empty string. Wenn ANSI_PADDING auf ON festgelegt ist, werden nachfolgende Leerzeichen eingefügt.If ANSI_PADDING is set to ON, trailing spaces are inserted. 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.The Microsoft SQL Server ODBC driver and OLE DB Provider for SQL Server automatically set ANSI_PADDING ON for each connection. Diese Einstellung kann in ODBC-Datenquellen oder durch Festlegen von Verbindungsattributen oder Verbindungseigenschaften konfiguriert werden.This can be configured in ODBC data sources or by setting connection attributes or properties. Weitere Informationen finden Sie unter SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

Aktualisieren der Spalten "text", "ntext" und "image"Updating text, ntext, and image Columns

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.Modifying a text, ntext, or image column with UPDATE initializes the column, assigns a valid text pointer to it, and allocates at least one data page, unless the column is being updated with NULL.

Wenn Sie große Datenblöcke des Datentyps text, ntext oder image ersetzen oder ändern möchten, verwenden Sie statt der UPDATE-Anweisung die WRITETEXT- oder UPDATETEXT-Anweisung.To replace or modify large blocks of text, ntext, or image data, use WRITETEXT or UPDATETEXT instead of the UPDATE statement.

Wenn die UPDATE-Anweisung beim Aktualisieren des Clusteringschlüssels und mindestens einer Spalte des Datentyps text, ntext oder image nicht mehrere Zeilen ändern konnte, wird das teilweise Update für diese Spalten als vollständige Ersetzung dieser Werte ausgeführt.If the UPDATE statement could change more than one row while updating both the clustering key and one or more text, ntext, or image columns, the partial update to these columns is executed as a full replacement of the values.

Wichtig

Die Datentypen ntext, text und image werden in einer zukünftigen Version von MicrosoftMicrosoft SQL ServerSQL Server entfernt.The ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoft SQL ServerSQL Server. Vermeiden Sie die Verwendung dieser Datentypen bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen sie aktuell verwendet werden.Avoid using these data types in new development work, and plan to modify applications that currently use them. Verwenden Sie stattdessen nvarchar(max), varchar(max)und varbinary(max) .Use nvarchar(max), varchar(max), and varbinary(max) instead.

Aktualisieren von Datentypen mit umfangreichen WertenUpdating Large Value Data Types

Mit der . WRITE-Klausel (expression, @Offset,@Length) können Sie ein partielles oder vollständiges Update der Datentypen varchar(max), nvarchar(max) und varbinary(max) ausführen.Use the . WRITE (expression, @Offset,@Length) clause to perform a partial or full update of varchar(max), nvarchar(max), and varbinary(max) data types. Bei dem teilweisen Update einer Spalte des Datentyps varchar(max) werden z.B. möglicherweise nur die ersten 200 Zeichen der Spalte gelöscht oder geändert, während bei einem vollständigen Update alle Daten in der Spalte gelöscht oder geändert würden.For example, a partial update of a varchar(max) column might delete or modify only the first 200 characters of the column, whereas a full update would delete or modify all the data in the column. Updates 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.. WRITE updates that insert or append new data are minimally logged if the database recovery model is set to bulk-logged or simple. Die minimale Protokollierung wird nicht verwendet, wenn vorhandene Werte aktualisiert werden.Minimal logging is not used when existing values are updated. Weitere Informationen finden Sie unter Das Transaktionsprotokoll (SQL Server).For more information, see The Transaction Log (SQL Server).

Datenbank-EngineDatabase Engine konvertiert ein teilweises Update in ein vollständiges Update, wenn die UPDATE-Anweisung eine dieser Aktionen bewirkt:The Datenbank-EngineDatabase Engine converts a partial update to a full update when the UPDATE statement causes either of these actions:

  • Ändert eine Schlüsselspalte der partitionierten Sicht oder Tabelle.Changes a key column of the partitioned view or table.
  • Ändert mehr als eine Zeile und aktualisiert außerdem den Schlüssel eines nicht eindeutigen gruppierten Index in einen nicht konstanten Wert.Modifies more than one row and also updates the key of a nonunique clustered index to a nonconstant value.

Sie können die . WRITE-Klausel nicht zur Aktualisierung einer NULL-Spalte oder zum Festlegen des column_name-Werts auf NULL verwenden.You cannot use the . WRITE clause to update a NULL column or set the value of column_name to NULL.

@Offset und @Length werden für die Datentypen varbinary und varchar in Byte und für den Datentyp nvarchar in Zeichen angegeben.@Offset and @Length are specified in bytes for varbinary and varchar data types and in characters for the nvarchar data type. Die geeigneten Offsets werden für Doppelbyte-Zeichensatzsortierungen (DBCS, Double-Byte Character Set) berechnet.The appropriate offsets are computed for double-byte character set (DBCS) collations.

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.For best performance, we recommend that data be inserted or updated in chunk sizes that are multiples of 8040 bytes.

Wenn in einer OUTPUT-Klausel auf die von der . WRITE-Klausel geänderte Spalte verwiesen wird, wird der vollständige Wert der Spalte – entweder das vorherige Image in deleted.column_name oder das endgültige Image in inserted.column_name – an die angegebene Spalte in der Tabellenvariablen zurückgegeben.If the column modified by the . WRITE clause is referenced in an OUTPUT clause, the complete value of the column, either the before image in deleted.column_name or the after image in inserted.column_name, is returned to the specified column in the table variable. Weitere Informationen finden Sie unten im Beispiel R.See example R that follows.

Verwenden Sie STUFF (Transact-SQL), um die gleiche Funktionalität der . WRITE-Klausel mit anderen Zeichen- oder binären Datentypen zu erzielen.To achieve the same functionality of . WRITE with other character or binary data types, use the STUFF (Transact-SQL).

Aktualisieren von Spalten mit benutzerdefiniertem DatentypUpdating User-defined Type Columns

Sie können Werte in benutzerdefinierten Spalten auf eine der folgenden Arten aktualisieren:Updating values in user-defined type columns can be accomplished in one of the following ways:

  • Bereitstellen eines Werts eines SQL ServerSQL Server-Systemdatentyps, sofern der benutzerdefinierte Typ implizite oder explizite Konvertierung von diesem Typ unterstützt.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. Im folgenden Beispiel wird gezeigt, wie Sie einen Wert in einer Spalte des benutzerdefinierten Typs Point durch explizites Konvertieren aus einer Zeichenfolge aktualisieren.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • Aufrufen einer als Mutator markierten Methode des benutzerdefinierten Typs, um das Update auszuführen.Invoking a method, marked as a mutator, of the user-defined type, to perform the update. Im folgenden Beispiel wird eine Mutatormethode des Typs Point namens SetXY aufgerufen.The following example invokes a mutator method of type Point named SetXY. Dadurch wird der Status der Instanz des Typs aktualisiert.This updates the state of the instance of the type.

    UPDATE Cities  
    SET Location.SetXY(23.5, 23.5)  
    WHERE Name = 'Anchorage';  
    

    Hinweis

    Von SQL ServerSQL Server wird ein Fehler zurückgegeben, wenn eine mutator-Methode für einen NULL-Wert von Transact-SQLTransact-SQL aufgerufen wird oder wenn ein neuer von einer mutator-Methode generierter Wert NULL ist. SQL ServerSQL Server returns an error if a mutator method is invoked on a Transact-SQLTransact-SQL null value, or if a new value produced by a mutator method is null.

  • Ändern des Werts eines Members einer öffentlichen Eigenschaft oder öffentlicher Daten des benutzerdefinierten Typs.Modifying the value of a registered property or public data member of the user-defined type. Der Ausdruck, der den Wert bereitstellt, muss implizit in den Typ der Eigenschaft konvertierbar sein.The expression supplying the value must be implicitly convertible to the type of the property. Im folgenden Beispiel wird der Wert der X-Eigenschaft des benutzerdefinierten Typs Point geändert.The following example modifies the value of property X of user-defined type Point.

    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.To modify different properties of the same user-defined type column, issue multiple UPDATE statements, or invoke a mutator method of the type.

Aktualisieren von FILESTREAM-DatenUpdating FILESTREAM Data

Sie können ein FILESTREAM-Feld mithilfe der UPDATE-Anweisung auf einen NULL-Wert, einen leeren Wert oder eine relativ kleine Menge von Inlinedaten aktualisieren.You can use the UPDATE statement to update a FILESTREAM field to a null value, empty value, or a relatively small amount of inline data. Große Datenmengen lassen sich jedoch mithilfe von Win32-Schnittstellen effizienter in eine Datei streamen.However, a large amount of data is more efficiently streamed into a file by using Win32 interfaces. Wenn Sie ein FILESTREAM-Feld aktualisieren, ändern Sie die zugrunde liegenden BLOB-Daten im Dateisystem.When you update a FILESTREAM field, you modify the underlying BLOB data in the file system. Wenn ein FILESTREAM-Feld auf NULL festgelegt wird, werden die dem Feld zugeordneten BLOB-Daten gelöscht.When a FILESTREAM field is set to NULL, the BLOB data associated with the field is deleted. Dabei kann .WRITE() nicht für teilweise Updates der FILESTREAM-Daten verwendet werden.You cannot use .WRITE(), to perform partial updates to FILESTREAM data. Weitere Informationen finden Sie unter FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

FehlerbehandlungError Handling

Wenn das Update einer Zeile eine Einschränkung oder Regel oder die NULL-Einstellung für die Spalte verletzt bzw. 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.If an update to a row violates a constraint or rule, violates the NULL setting for the column, or the new value is an incompatible data type, the statement is canceled, an error is returned, and no records are updated.

Wenn in einer UPDATE-Anweisung ein arithmetischer Fehler (Überlauf, Division durch Null oder Definitionsbereichsfehler/Domänenfehler) bei der Auswertung eines Ausdrucks auftritt, wird das Update nicht ausgeführt.When an UPDATE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) during expression evaluation, the update is not performed. Der Rest des Batches wird nicht ausgeführt, und eine Fehlermeldung wird zurückgegeben.The rest of the batch is not executed, and an error message is returned.

Wenn das Update mindestens einer Spalte eines gruppierten Index dazu führt, dass die Größe des gruppierten Index und der Zeile den Wert von 8.060 Byte überschreitet, tritt beim Update ein Fehler auf, und es wird eine Fehlermeldung zurückgegeben.If an update to a column or columns participating in a clustered index causes the size of the clustered index and the row to exceed 8,060 bytes, the update fails and an error message is returned.

InteroperabilitätInteroperability

UPDATE-Anweisungen sind im Textkörper von benutzerdefinierten Funktionen nur zulässig, wenn es sich bei der Tabelle, die geändert wird, um eine Tabellenvariable handelt.UPDATE statements are allowed in the body of user-defined functions only if the table being modified is a table variable.

Wenn ein INSTEAD-OF-Trigger für UPDATE-Aktionen für eine Tabelle definiert ist, wird der Trigger statt der UPDATE-Anweisung ausgeführt.When an INSTEAD OF trigger is defined on UPDATE actions against a table, the trigger is running instead of the UPDATE statement. Frühere Versionen von SQL ServerSQL Server unterstützen nur AFTER-Trigger für UPDATE-Anweisungen und andere Anweisungen zur Datenänderung.Earlier versions of SQL ServerSQL Server only support AFTER triggers defined on UPDATE and other data modification statements. Die FROM-Klausel kann nicht in einer UPDATE-Anweisung angegeben werden, die (direkt oder indirekt) auf eine Sicht verweist, für die ein INSTEAD OF-Trigger definiert wurde.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

EinschränkungenLimitations and Restrictions

Die FROM-Klausel kann nicht in einer UPDATE-Anweisung angegeben werden, die (direkt oder indirekt) auf eine Ansicht verweist, für die ein INSTEAD OF-Trigger definiert ist.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view that has an INSTEAD OF trigger defined on it. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Wenn ein allgemeiner Tabellenausdruck (Common Table Expression, CTE) das Ziel einer UPDATE-Anweisung ist, müssen alle Verweise auf den allgemeinen Tabellenausdruck in der Anweisung übereinstimmen.When a common table expression (CTE) is the target of an UPDATE statement, all references to the CTE in the statement must match. Wenn dem allgemeinen Tabellenausdruck z. B. ein Alias in der FROM-Klausel zugewiesen wird, muss der Alias für alle weiteren Verweise auf den allgemeinen Tabellenausdruck verwendet werden.For example, if the CTE is assigned an alias in the FROM clause, the alias must be used for all other references to the CTE. Eindeutige Verweise auf allgemeine Tabellenausdrücke sind erforderlich, da ein allgemeiner Tabellenausdruck keine Objekt-ID hat, mit der SQL ServerSQL Server die implizite Beziehung zwischen einem Objekt und seinem Alias erkennt.Unambiguous CTE references are required because a CTE does not have an object ID, which SQL ServerSQL Server uses to recognize the implicit relationship between an object and its alias. Ohne diese Beziehung erzeugt der Abfrageplan möglicherweise ein unerwartetes Joinverhalten und unbeabsichtigte Abfrageergebnisse.Without this relationship, the query plan may produce unexpected join behavior and unintended query results. In den folgenden Beispielen werden richtige und falsche Methoden zum Angeben eines allgemeinen Tabellenausdrucks veranschaulicht, wenn der allgemeine Tabellenausdruck das Zielobjekt des Updatevorgangs ist.The following examples demonstrate correct and incorrect methods of specifying a CTE when the CTE is the target object of the update operation.

USE tempdb;  
GO  
-- UPDATE statement with CTE references that are correctly matched.  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  

WITH cte AS (SELECT * FROM @x)  
UPDATE x -- cte is referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;  
SELECT * FROM @x;  
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

ID     Value  
------ -----  
1      100  
2      200  
(2 row(s) affected)  

UPDATE-Anweisung mit falsch abgeglichenen Verweisen des allgemeinen Tabellenausdrucks.UPDATE statement with CTE references that are incorrectly matched.

USE tempdb;  
GO  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  

WITH cte AS (SELECT * FROM @x)  
UPDATE cte   -- cte is not referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;   
SELECT * FROM @x;   
GO  

Im Folgenden finden Sie das Resultset.Here is the result set.

ID     Value  
------ -----  
1      100  
2      100  
(2 row(s) affected)  

SperrverhaltenLocking Behavior

Eine UPDATE-Anweisung ruft immer eine exklusive (X) Sperre für die von ihr geänderte Tabelle ab und hält diese Sperre bis zum Abschluss der Transaktion aufrecht.An UPDATE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. Bei einer exklusiven Sperre können keine anderen Transaktionen Daten ändern.With an exclusive lock, no other transactions can modify data. Sie können Tabellenhinweise angeben, um dieses Standardverhalten für die Dauer der UPDATE-Anweisung zu überschreiben, indem Sie eine andere Sperrmethode angeben. Es wird jedoch empfohlen, dass Hinweise nur von erfahrenen Entwicklern und Datenbankadministratoren und nur als letzte Möglichkeit verwendet werden.You can specify table hints to override this default behavior for the duration of the UPDATE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. Weitere Informationen finden Sie unter Tabellenhinweise (Transact-SQL).For more information, see Table Hints (Transact-SQL).

ProtokollierungsverhaltenLogging Behavior

Die UPDATE-Anweisung wird protokolliert; Teilupdates von Datentypen mit umfangreichen Werten, welche die . WRITE-Klausel verwenden, werden allerdings nur minimal protokolliert.The UPDATE statement is logged; however, partial updates to large value data types using the . WRITE clause are minimally logged. Weitere Informationen finden Sie im vorherigen Abschnitt „Datentypen“ unter „Aktualisieren von Datentypen mit umfangreichen Werten“.For more information, see "Updating Large Value Data Types" in the earlier section "Data Types".

SecuritySecurity

BerechtigungenPermissions

Für die Zieltabelle sind UPDATE-Berechtigungen erforderlich.UPDATE permissions are required on the target table. SELECT-Berechtigungen sind zum Aktualisieren der Tabelle auch erforderlich, wenn die UPDATE-Anweisung eine WHERE-Klausel enthält, oder wenn expression in der SET-Klausel eine Spalte in der Tabelle verwendet.SELECT permissions are also required for the table being updated if the UPDATE statement contains a WHERE clause, or if expression in the SET clause uses a column in the table.

Für die UPDATE-Berechtigungen werden standardmäßig Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrollen db_owner und db_datawriter und des Tabellenbesitzers festgelegt.UPDATE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Mitglieder der Rollen sysadmin, db_owner und db_securityadmin sowie der Tabellenbesitzer können Berechtigungen an andere Benutzer übertragen.Members of the sysadmin, db_owner, and db_securityadmin roles, and the table owner can transfer permissions to other users.

BeispieleExamples

KategorieCategory FunktionssyntaxelementeFeatured syntax elements
Grundlegende SyntaxBasic Syntax UPDATEUPDATE
Eingrenzen der zu aktualisierenden ZeilenLimiting the Rows that Are Updated WHERE • TOP • WITH common table expression • WHERE CURRENT OFWHERE • TOP • WITH common table expression • WHERE CURRENT OF
Festlegen von SpaltenwertenSetting Column Values Berechnete Werte • Verbundoperatoren • Standardwerte • Unterabfragencomputed values • compound operators • default values • subqueries
Angeben von Zielobjekten, die keine Standardtabellen sindSpecifying Target Objects Other than Standard Tables Sichten • Tabellenvariablen • Tabellenaliaseviews • table variables • table aliases
Aktualisieren von Daten auf Grundlage von Daten aus anderen TabellenUpdating Data Based on Data From Other Tables FROMFROM
Aktualisieren von Zeilen in einer RemotetabelleUpdating Rows in a Remote Table Verbindungsserver • OPENQUERY • OPENDATASOURCElinked server • OPENQUERY • OPENDATASOURCE
Aktualisieren von Large Object-DatentypenUpdating Large Object Data Types .WRITE • OPENROWSET.WRITE • OPENROWSET
Aktualisieren benutzerdefinierter TypenUpdating User-defined Types Benutzerdefinierte Typenuser-defined types
Überschreiben des Standardverhaltens des Abfrageoptimierers mithilfe von HinweisenOverriding the Default Behavior of the Query Optimizer by Using Hints Tabellenhinweise • Abfragehinweisetable hints • query hints
Erfassen der Ergebnisse der UPDATE-AnweisungCapturing the Results of the UPDATE Statement OUTPUT-KlauselOUTPUT clause
Verwenden von UPDATE in anderen AnweisungenUsing UPDATE in Other Statements Gespeicherte Prozeduren • TRY...CATCHStored Procedures • TRY...CATCH

Grundlegende SyntaxBasic Syntax

Anhand von Beispielen in diesem Abschnitt wird die grundlegende Funktion der UPDATE-Anweisung mithilfe der mindestens erforderlichen Syntax veranschaulicht.Examples in this section demonstrate the basic functionality of the UPDATE statement using the minimum required syntax.

A.A. Verwenden einer einfachen UPDATE-AnweisungUsing a simple UPDATE statement

Im folgenden Beispiel wird eine einzelne Spalte für alle Zeilen in der Person.Address-Tabelle aktualisiert.The following example updates a single column for all rows in the Person.Address table.

USE AdventureWorks2012;  
GO  
UPDATE Person.Address  
SET ModifiedDate = GETDATE();  

B.B. Aktualisieren mehrerer SpaltenUpdating multiple columns

Im folgenden Beispiel werden die Werte in den Spalten Bonus, CommissionPct und SalesQuota für alle Zeilen in der SalesPerson-Tabelle aktualisiert.The following example updates the values in the Bonus, CommissionPct, and SalesQuota columns for all rows in the SalesPerson table.

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

Eingrenzen der zu aktualisierenden ZeilenLimiting the Rows that Are Updated

Die Beispiele in diesem Abschnitt veranschaulichen Methoden, mit denen die Anzahl der von der UPDATE-Anweisung betroffenen Zeilen eingegrenzt werden kann.Examples in this section demonstrate ways that you can use to limit the number of rows affected by the UPDATE statement.

C.C. Verwenden der WHERE-KlauselUsing the WHERE clause

Im folgenden Beispiel wird die WHERE-Klausel verwendet, um die zu aktualisierenden Zeilen anzugeben.The following example uses the WHERE clause to specify which rows to update. Die Anweisung aktualisiert den Wert in der Spalte Color der Tabelle Production.Product für alle Zeilen, die in der Spalte Color den vorhandenen Wert "Red" aufweisen und einen Wert in der Spalte Name aufweisen, der mit "Road-250" beginnt.The statement updates the value in the Color column of the Production.Product table for all rows that have an existing value of 'Red' in the Color column and have a value in the Name column that starts with 'Road-250'.

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

D.D. Verwenden der TOP-KlauselUsing the TOP clause

In den folgenden Beispielen wird mithilfe der TOP-Klausel die Anzahl der Zeilen beschränkt, die in einer UPDATE-Anweisung geändert werden.The following examples use the TOP clause to limit the number of rows that are modified in an UPDATE statement. Wenn eine TOP (n)-Klausel mit UPDATE verwendet wird, wird der Updatevorgang für eine zufällige Auswahl von n Zeilen ausgeführt.When a TOP (n) clause is used with UPDATE, the update operation is performed on a random selection of 'n' number of rows. Im folgenden Beispiel wird die VacationHours-Spalte um 25 Prozent für 10 zufällige Zeilen in der Employee-Tabelle aktualisiert.The following example updates the VacationHours column by 25 percent for 10 random rows in the Employee table.

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

Wenn TOP verwendet werden muss, um Updates in einer sinnvollen Abfolge anzuwenden, muss in einer untergeordneten SELECT-Anweisung TOP gemeinsam mit ORDER BY verwendet werden.If you must use TOP to apply updates in a meaningful chronology, you must use TOP together with ORDER BY in a subselect statement. Mit dem nachfolgenden Beispiel werden die Urlaubsstunden der 10 Mitarbeiter mit dem frühesten Einstellungsdatum aktualisiert.The following example updates the vacation hours of the 10 employees with the earliest hire dates.

UPDATE HumanResources.Employee  
SET VacationHours = VacationHours + 8  
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee  
     ORDER BY HireDate ASC) AS th  
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;  
GO  

E.E. Verwenden der WITH common_table_expression-KlauselUsing the WITH common_table_expression clause

Im folgenden Beispiel wird der PerAssemblyQty-Wert für alle Teile und Komponenten aktualisiert, die direkt oder indirekt zum Erstellen der ProductAssemblyID 800 verwendet werden.The following example updates the PerAssemblyQty value for all parts and components that are used directly or indirectly to create the ProductAssemblyID 800. Der allgemeine Tabellenausdruck gibt eine hierarchische Liste mit Teilen zurück, die zum Erstellen der ProductAssemblyID 800 direkt verwendet werden, sowie mit Teilen, die zum Erstellen dieser Komponenten verwendet werden, usw.The common table expression returns a hierarchical list of parts that are used directly to build ProductAssemblyID 800 and parts that are used to build those components, and so on. Nur die Zeilen, die vom allgemeinen Tabellenausdruck zurückgegeben werden, werden geändert.Only the rows returned by the common table expression are modified.

USE AdventureWorks2012;  
GO  
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS  
(  
    SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,  
        b.EndDate, 0 AS ComponentLevel  
    FROM Production.BillOfMaterials AS b  
    WHERE b.ProductAssemblyID = 800  
          AND b.EndDate IS NULL  
    UNION ALL  
    SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,  
        bom.EndDate, ComponentLevel + 1  
    FROM Production.BillOfMaterials AS bom   
        INNER JOIN Parts AS p  
        ON bom.ProductAssemblyID = p.ComponentID  
        AND bom.EndDate IS NULL  
)  
UPDATE Production.BillOfMaterials  
SET PerAssemblyQty = c.PerAssemblyQty * 2  
FROM Production.BillOfMaterials AS c  
JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID  
WHERE d.ComponentLevel = 0;  

F.F. Verwenden der WHERE CURRENT OF-KlauselUsing the WHERE CURRENT OF clause

Im folgenden Beispiel wird die WHERE CURRENT OF-Klausel verwendet, um nur die Zeile zu aktualisieren, auf der der Cursor positioniert ist.The following example uses the WHERE CURRENT OF clause to update only the row on which the cursor is positioned. Wenn ein Cursor auf einem Join basiert, wird nur die Tabelle geändert, die mit table_name in der UPDATE-Anweisung angegeben wurde.When a cursor is based on a join, only the table_name specified in the UPDATE statement is modified. Andere im Cursor enthaltene Tabellen sind davon nicht betroffen.Other tables participating in the cursor are not affected.

USE AdventureWorks2012;  
GO  
DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
UPDATE HumanResources.EmployeePayHistory  
SET PayFrequency = 2   
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  
GO  

Festlegen von SpaltenwertenSetting Column Values

Die Beispiele in diesem Abschnitt veranschaulichen das Update von Spalten mithilfe von berechneten Werten, Unterabfragen und DEFAULT-Werten.Examples in this section demonstrate updating columns by using computed values, subqueries, and DEFAULT values.

G.G. Angeben eines berechneten WertsSpecifying a computed value

In den folgenden Beispielen werden berechnete Werte in einer UPDATE-Anweisung verwendet.The following examples uses computed values in an UPDATE statement. In diesem Beispiel wird der Wert in der ListPrice-Spalte für alle Zeilen in der Product-Tabelle verdoppelt.The example doubles the value in the ListPrice column for all rows in the Product table.

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

H.H. Angeben eines VerbundoperatorsSpecifying a compound operator

Im folgenden Beispiel wird die @NewPrice-Variable verwendet, um den Preis aller roten Fahrräder zu erhöhen, indem zum aktuellen Preis der Wert 10 addiert wird.The following example uses the variable @NewPrice to increment the price of all red bicycles by taking the current price and adding 10 to it.

USE AdventureWorks2012;  
GO  
DECLARE @NewPrice int = 10;  
UPDATE Production.Product  
SET ListPrice += @NewPrice  
WHERE Color = N'Red';  
GO  

Im folgenden Beispiel werden mithilfe des Verbundoperators += die ' - tool malfunction'-Daten an den vorhandenen Wert in der Spalte Name für Zeilen mit einer ScrapReasonID zwischen 10 und 12 angefügt.The following example uses the compound operator += to append the data ' - tool malfunction' to the existing value in the column Name for rows that have a ScrapReasonID between 10 and 12.

USE AdventureWorks2012;  
GO  
UPDATE Production.ScrapReason   
SET Name += ' - tool malfunction'  
WHERE ScrapReasonID BETWEEN 10 and 12;  

I.I. Angeben einer Unterabfrage in der SET-KlauselSpecifying a subquery in the SET clause

Im folgenden Beispiel wird mit einer Unterabfrage in der SET-Klausel der Wert bestimmt, der zum Aktualisieren der Spalte verwendet wird.The following example uses a subquery in the SET clause to determine the value that is used to update the column. Die Unterabfrage muss nur einen Skalarwert (d. h. einen einzelnen Wert pro Zeile) zurückgeben.The subquery must return only a scalar value (that is, a single value per row). In diesem Beispiel wird die Spalte SalesYTD in der SalesPerson-Tabelle geändert, um die neuesten Verkaufszahlen in der SalesOrderHeader-Tabelle wiederzugeben.The example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table. Die Unterabfrage aggregiert die Umsätze für jeden Vertriebsmitarbeiter in der UPDATE-Anweisung.The subquery aggregates the sales for each salesperson in the UPDATE statement.

USE AdventureWorks2012;  
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.BusinessEntityID = so.SalesPersonID  
     GROUP BY so.SalesPersonID);  
GO  

J.J. Aktualisieren von Zeilen mit DEFAULT-WertenUpdating rows using DEFAULT values

Im folgenden Beispiel wird die Spalte CostRate auf den Standardwert (0.00) für alle Zeilen festgelegt, die über einen CostRate-Wert größer als 20.00 verfügen.The following example sets the CostRate column to its default value (0.00) for all rows that have a CostRate value greater than 20.00.

USE AdventureWorks2012;  
GO  
UPDATE Production.Location  
SET CostRate = DEFAULT  
WHERE CostRate > 20.00;  

Angeben von Zielobjekten, die keine Standardtabellen sindSpecifying Target Objects Other Than Standard Tables

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie Zeilen durch Angeben einer Sicht, eines Tabellenalias oder einer Tabellenvariablen aktualisiert werden.Examples in this section demonstrate how to update rows by specifying a view, table alias, or table variable.

K.K. Angeben einer Sicht als ZielobjektSpecifying a view as the target object

Im folgenden Beispiel werden Zeilen in einer Tabelle aktualisiert, indem eine Sicht als Zielobjekt angegeben wird.The following example updates rows in a table by specifying a view as the target object. Die Sichtdefinition verweist auf mehrere Tabellen, die UPDATE-Anweisung wird jedoch erfolgreich ausgeführt, da sie auf Spalten nur von einer der zugrunde liegenden Tabellen verweist.The view definition references multiple tables, however, the UPDATE statement succeeds because it references columns from only one of the underlying tables. Die UPDATE-Anweisung würde fehlschlagen, wenn Spalten von beiden Tabellen angegeben wären.The UPDATE statement would fail if columns from both tables were specified. Weitere Informationen finden Sie unter Modify Data Through a View (Ändern von Daten über eine Sicht).For more information, see Modify Data Through a View.

USE AdventureWorks2012;  
GO  
UPDATE Person.vStateProvinceCountryRegion  
SET CountryRegionName = 'United States of America'  
WHERE CountryRegionName = 'United States';  

L.L. Angeben eines Tabellenalias als ZielobjektSpecifying a table alias as the target object

Im folgenden Beispiel werden Zeilen in der Tabelle Production.ScrapReason aktualisiert.The follow example updates rows in the table Production.ScrapReason. Der ScrapReason in der FROM-Klausel zugewiesene Tabellenalias wird als Zielobjekt in der UPDATE-Klausel angegeben.The table alias assigned to ScrapReason in the FROM clause is specified as the target object in the UPDATE clause.

USE AdventureWorks2012;  
GO  
UPDATE sr  
SET sr.Name += ' - tool malfunction'  
FROM Production.ScrapReason AS sr  
JOIN Production.WorkOrder AS wo   
     ON sr.ScrapReasonID = wo.ScrapReasonID  
     AND wo.ScrappedQty > 300;  

M.M. Angeben einer Tabellenvariablen als ZielobjektSpecifying a table variable as the target object

Im folgenden Beispiel werden Zeilen in einer Tabellenvariablen aktualisiert.The following example updates rows in a table variable.

USE AdventureWorks2012;  
GO  
-- Create the table variable.  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    NewVacationHours int,  
    ModifiedDate datetime);  

-- Populate the table variable with employee ID values from HumanResources.Employee.  
INSERT INTO @MyTableVar (EmpID)  
    SELECT BusinessEntityID FROM HumanResources.Employee;  

-- Update columns in the table variable.  
UPDATE @MyTableVar  
SET NewVacationHours = e.VacationHours + 20,  
    ModifiedDate = GETDATE()  
FROM HumanResources.Employee AS e   
WHERE e.BusinessEntityID = EmpID;  

-- Display the results of the UPDATE statement.  
SELECT EmpID, NewVacationHours, ModifiedDate FROM @MyTableVar  
ORDER BY EmpID;  
GO  

Aktualisieren von Daten auf Grundlage von Daten aus anderen TabellenUpdating Data Based on Data From Other Tables

Anhand von Beispielen in diesem Abschnitt werden Methoden zum Aktualisieren von Zeilen auf Grundlage von Informationen in einer anderen Tabelle gezeigt.Examples in this section demonstrate methods of updating rows from one table based on information in another table.

N.N. Verwenden der UPDATE-Anweisung mit Informationen aus einer anderen TabelleUsing the UPDATE statement with information from another table

Im folgenden Beispiel wird die SalesYTD in der SalesPerson-Tabelle geändert, um die neuesten Verkaufszahlen in der SalesOrderHeader-Tabelle wiederzugeben.The following example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table.

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

Im vorherigen Beispiel wird angenommen, dass nur ein Verkauf für einen angegebenen Verkäufer an einem bestimmten Datum aufgezeichnet wird und Updates aktuell sind.The previous example assumes that only one sale is recorded for a specified salesperson on a specific date and that updates are current. Wenn mehr als ein Verkauf für einen angegebenen Verkäufer am selben Tag gespeichert werden kann, funktioniert das gezeigte Beispiel nicht richtig.If more than one sale for a specified salesperson can be recorded on the same day, the example shown does not work correctly. 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.The example runs without error, but each SalesYTD value is updated with only one sale, regardless of how many sales actually occurred on that day. Die Ursache ist darin zu suchen, dass eine einzelne UPDATE-Anweisung dieselbe Zeile nicht zweimal ändern kann.This is because a single UPDATE statement never updates the same row two times.

Wenn für einen angegebenen Vertriebsmitarbeiter mehrere Verkäufe pro Tag möglich sind, müssen sämtliche Verkäufe der einzelnen Vertriebsmitarbeiter mithilfe der UPDATE-Anweisung aggregiert werden, wie im nachfolgenden Beispiel dargestellt:In the situation in which more than one sale for a specified salesperson can occur on the same day, all the sales for each sales person must be aggregated together within the UPDATE statement, as shown in the following example:

USE AdventureWorks2012;  
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.BusinessEntityID = so.SalesPersonID  
     GROUP BY so.SalesPersonID);  
GO  

Aktualisieren von Zeilen in einer RemotetabelleUpdating Rows in a Remote Table

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie Zeilen in einer Remotezieltabelle mit einem Verbindungsserver oder einer Rowsetfunktion aktualisiert werden, um auf die Remotetabelle zu verweisen.Examples in this section demonstrate how to update rows in a remote target table by using a linked server or a rowset function to reference the remote table.

O.O. Aktualisieren von Daten in einer Remotetabelle mithilfe eines VerbindungsserversUpdating data in a remote table by using a linked server

Im folgenden Beispiel wird eine Tabelle auf einem Remoteserver aktualisiert.The following example updates a table on a remote server. In diesem Beispiel wird zunächst mithilfe von sp_addlinkedserver ein Link zur Remotedatenquelle erstellt.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Der Name des Verbindungsservers (MyLinkedServer) wird anschließend als Teil des vierteiligen Objektnamens in der Form server.catalog.schema.object angegeben.The linked server name, MyLinkedServer, is then specified as part of the four-part object name in the form server.catalog.schema.object. Beachten Sie, dass Sie einen gültigen Servernamen für @datasrc angeben müssen.Note that you must specify a valid server name for @datasrc.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_nameinstance_name'.  

EXEC sp_addlinkedserver @server = N'MyLinkedServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI10',   
    @datasrc = N'<server name>',  
    @catalog = N'AdventureWorks2012';  
GO  
USE AdventureWorks2012;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  

UPDATE MyLinkedServer.AdventureWorks2012.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

P.P. Aktualisieren von Daten in einer Remotetabelle mithilfe der OPENQUERY-FunktionUpdating data in a remote table by using the OPENQUERY function

Im folgenden Beispiel wird durch Angabe der OPENQUERY-Rowsetfunktion eine Zeile in einer Remotetabelle aktualisiert.The following example updates a row in a remote table by specifying the OPENQUERY rowset function. Der im vorherigen Beispiel erstellte Name des Verbindungsservers wird hier verwendet.The linked server name created in the previous example is used in this example.

UPDATE OPENQUERY (MyLinkedServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')   
SET GroupName = 'Sales and Marketing';  

Q.Q. Aktualisieren von Daten in einer Remotetabelle mithilfe der OPENDATASOURCE-FunktionUpdating data in a remote table by using the OPENDATASOURCE function

Im folgenden Beispiel wird durch Angabe der OPENDATASOURCE-Rowsetfunktion eine Zeile in einer Remotetabelle aktualisiert.The following example updates a row in a remote table by specifying the OPENDATASOURCE rowset function. Geben Sie im Format server_name oder server_name\instance_name einen gültigen Servernamen für die Datenquelle an.Specify a valid server name for the data source by using the format server_name or server_name\instance_name. Sie müssen möglicherweise die Instanz von SQL ServerSQL Server für "Ad Hoc Distributed Queries" konfigurieren.You may need to configure the instance of SQL ServerSQL Server for Ad Hoc Distributed Queries. Weitere Informationen finden Sie unter Verteilte Ad-hoc-Abfragen (Serverkonfigurationsoption).For more information, see ad hoc distributed queries Server Configuration Option.

UPDATE OPENDATASOURCE('SQLNCLI', 'Data Source=<server name>;Integrated Security=SSPI').AdventureWorks2012.HumanResources.Department
SET GroupName = 'Sales and Marketing' WHERE DepartmentID = 4;  

Aktualisieren von Large Object-DatentypenUpdating Large Object Data Types

Anhand von Beispielen in diesem Abschnitt werden Methoden zum Aktualisieren von Werten in Spalten gezeigt, die mit LOB-Datentypen (Large Object) definiert sind.Examples in this section demonstrate methods of updating values in columns that are defined with large object (LOB) data types.

R.R. Verwenden von UPDATE mit .WRITE zum Ändern von Daten in einer nvarchar(max)-SpalteUsing UPDATE with .WRITE to modify data in an nvarchar(max) column

Im folgenden Beispiel wird die .WRITE-Klausel verwendet, um einen Teilwert in DocumentSummary zu aktualisieren, einer Spalte des Datentyps nvarchar(max) in der Production.Document-Tabelle.The following example uses the .WRITE clause to update a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table. Das Wort components wird durch das Wort features ersetzt. Dazu werden das Ersetzungswort, die Anfangsposition (Offset) des zu ersetzenden Worts in den vorhandenen Daten und die Anzahl von zu ersetzenden Zeichen (Länge) angegeben.The word components is replaced with the word features by specifying the replacement word, the starting location (offset) of the word to be replaced in the existing data, and the number of characters to be replaced (length). Im Beispiel wird außerdem die OUTPUT-Klausel zur Rückgabe der Anfangs- und Endimages der Spalte DocumentSummary an die @MyTableVar-Tabellenvariable verwendet.The example also uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar table variable.

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table (  
    SummaryBefore nvarchar(max),  
    SummaryAfter nvarchar(max));  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N'features',28,10)  
OUTPUT deleted.DocumentSummary,   
       inserted.DocumentSummary   
    INTO @MyTableVar  
WHERE Title = N'Front Reflector Bracket Installation';  
SELECT SummaryBefore, SummaryAfter   
FROM @MyTableVar;  
GO  

S.S. Verwenden von UPDATE mit .WRITE zum Hinzufügen und Entfernen von Daten in einer nvarchar(max)-SpalteUsing UPDATE with .WRITE to add and remove data in an nvarchar(max) column

In den folgenden Beispielen werden Daten zu einer nvarchar(max)-Spalte hinzugefügt bzw. daraus entfernt, die einen Wert aufweist, der derzeit auf NULL festgelegt ist.The following examples add and remove data from an nvarchar(max) column that has a value currently set to NULL. Da die .WRITE-Klausel nicht zum Ändern einer NULL-Spalte verwendet werden kann, wird die Spalte zunächst mit temporären Daten aufgefüllt.Because the .WRITE clause cannot be used to modify a NULL column, the column is first populated with temporary data. Anschließend werden diese Daten mithilfe der .WRITE-Klausel durch die richtigen Daten ersetzt.This data is then replaced with the correct data by using the .WRITE clause. In den zusätzlichen Beispielen werden am Ende des Spaltenwerts Daten angefügt, Daten (durch Abschneiden) aus der Spalte entfernt und schließlich Teildaten aus der Spalte entfernt.The additional examples append data to the end of the column value, remove (truncate) data from the column and, finally, remove partial data from the column. Die SELECT-Anweisungen zeigen die Datenänderung an, die von jeder UPDATE-Anweisung generiert wurde.The SELECT statements display the data modification generated by each UPDATE statement.

USE AdventureWorks2012;  
GO  
-- Replacing NULL value with temporary data.  
UPDATE Production.Document  
SET DocumentSummary = N'Replacing NULL value'  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
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 Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
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 Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
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 Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing partial data beginning at position 9 and ending at   
-- position 21.  
UPDATE Production.Document  
SET DocumentSummary .WRITE ('',9, 12)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  

T.T. Verwenden von UPDATE mit OPENROWSET zum Ändern einer varbinary(max)-SpalteUsing UPDATE with OPENROWSET to modify a varbinary(max) column

Im folgenden Beispiel wird ein vorhandenes Image, das in einer varbinary(max)-Spalte gespeichert ist, durch ein neues Image ersetzt.The following example replaces an existing image stored in a varbinary(max) column with a new image. Die OPENROWSET-Funktion wird mit der BULK-Option verwendet, um das Image in die Spalte zu laden.The OPENROWSET function is used with the BULK option to load the image into the column. In diesem Beispiel wird angenommen, dass eine Datei namens Tires.jpg im angegebenen Dateipfad vorhanden ist.This example assumes that a file named Tires.jpg exists in the specified file path.

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

U.U. Verwenden von UPDATE zum Ändern von FILESTREAM-DatenUsing UPDATE to modify FILESTREAM data

Im folgenden Beispiel wird die UPDATE-Anweisung zum Ändern der Daten in der Dateisystemdatei verwendet.The following example uses the UPDATE statement to modify the data in the file system file. Diese Methode wird nicht zum Streamen von großen Datenmengen in eine Datei empfohlen.We do not recommend this method for streaming large amounts of data to a file. Verwenden Sie die entsprechenden Win32-Schnittstellen.Use the appropriate Win32 interfaces. Im folgenden Beispiel wird der gesamte Text im Dateidatensatz durch den Text Xray 1ersetzt.The following example replaces any text in the file record with the text Xray 1. Weitere Informationen finden Sie unter FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

UPDATE Archive.dbo.Records  
SET [Chart] = CAST('Xray 1' as varbinary(max))  
WHERE [SerialNumber] = 2;  

Aktualisieren benutzerdefinierter TypenUpdating User-defined Types

In den folgenden Beispielen werden Werte in Spalten eines CLR-benutzerdefinierten Typs (UDT) geändert.The following examples modify values in CLR user-defined type (UDT) columns. Es werden drei Methoden gezeigt.Three methods are demonstrated. Weitere Informationen zu benutzerdefinierten Spalten finden Sie unter Benutzerdefinierte CLR-Typen.For more information about user-defined columns, see CLR User-Defined Types.

V.V. Verwenden eines SystemdatentypsUsing a system data type

Sie können einen UDT durch Bereitstellen eines Werts eines SQL ServerSQL Server-Systemdatentyps aktualisieren, sofern der benutzerdefinierte Typ implizite oder explizite Konvertierung von diesem Typ unterstützt.You can update a UDT by supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. Im folgenden Beispiel wird gezeigt, wie Sie einen Wert in einer Spalte des benutzerdefinierten Typs Point durch explizites Konvertieren aus einer Zeichenfolge aktualisieren.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

UPDATE dbo.Cities  
SET Location = CONVERT(Point, '12.3:46.2')  
WHERE Name = 'Anchorage';  

W.W. Aufrufen einer MethodeInvoking a method

Sie können einen UDT durch Aufrufen einer Methode des benutzerdefinierten Typs, die als Mutator markiert ist, aktualisieren, um das Update auszuführen.You can update a UDT by invoking a method, marked as a mutator, of the user-defined type, to perform the update. Im folgenden Beispiel wird eine Mutatormethode des Typs Point namens SetXY aufgerufen.The following example invokes a mutator method of type Point named SetXY. Dadurch wird der Status der Instanz des Typs aktualisiert.This updates the state of the instance of the type.

UPDATE dbo.Cities  
SET Location.SetXY(23.5, 23.5)  
WHERE Name = 'Anchorage';  

X.X. Ändern des Werts einer Eigenschaft oder eines DatenelementsModifying the value of a property or data member

Sie können einen UDT durch Ändern des Werts eines Elements einer registrierten Eigenschaft oder öffentlicher Daten des benutzerdefinierten Typs aktualisieren.You can update a UDT by modifying the value of a registered property or public data member of the user-defined type. Der Ausdruck, der den Wert bereitstellt, muss implizit in den Typ der Eigenschaft konvertierbar sein.The expression supplying the value must be implicitly convertible to the type of the property. Im folgenden Beispiel wird der Wert der X-Eigenschaft des benutzerdefinierten Typs Point geändert.The following example modifies the value of property X of user-defined type Point.

UPDATE dbo.Cities  
SET Location.X = 23.5  
WHERE Name = 'Anchorage';  

Überschreiben des Standardverhaltens des Abfrageoptimierers mithilfe von HinweisenOverriding the Default Behavior of the Query Optimizer by Using Hints

In den Beispielen in diesem Abschnitt wird gezeigt, wie mit Tabellen- und Abfragehinweisen beim Verarbeiten der UPDATE-Anweisung zeitweise das Standardverhalten des Abfrageoptimierers überschrieben wird.Examples in this section demonstrate how to use table and query hints to temporarily override the default behavior of the query optimizer when processing the UPDATE statement.

Achtung

Da der SQL ServerSQL Server-Abfrageoptimierer in der Regel den optimalen Ausführungsplan für eine Abfrage auswählt, wird empfohlen, dass erfahrene Entwickler und Datenbankadministratoren Hinweise nur dann verwenden, wenn alle anderen Möglichkeiten sich als unzureichend erwiesen haben.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Y.Y. Angeben eines TabellenhinweisesSpecifying a table hint

Im folgenden Beispiel wird der Tabellenhinweis TABLOCK angegeben.The following example specifies the table hint TABLOCK. Dieser Hinweis gibt an, dass eine gemeinsame Sperre für die Tabelle Production.Product eingerichtet und bis zum Ende der UPDATE-Anweisung aufrechterhalten wird.This hint specifies that a shared lock is taken on the table Production.Product and held until the end of the UPDATE statement.

USE AdventureWorks2012;  
GO  
UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

Z.Z. Angeben eines AbfragehinweisesSpecifying a query hint

Im folgenden Beispiel wird der AbfragehinweisOPTIMIZE FOR (@variable) in der UPDATE-Anweisung angegeben.The following example specifies the query hintOPTIMIZE FOR (@variable) in the UPDATE statement. Dieser Hinweis weist den Abfrageoptimierer an, einen bestimmten Wert für eine lokale Variable zu verwenden, wenn die Abfrage kompiliert und optimiert wird.This hint instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. Dieser Wert wird nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung.The value is used only during query optimization, and not during query execution.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE Production.uspProductUpdate  
@Product nvarchar(25)  
AS  
SET NOCOUNT ON;  
UPDATE Production.Product  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE @Product  
OPTION (OPTIMIZE FOR (@Product = 'BK-%') );  
GO  
-- Execute the stored procedure   
EXEC Production.uspProductUpdate 'BK-%';  

Erfassen der Ergebnisse der UPDATE-AnweisungCapturing the Results of the UPDATE Statement

In den Beispielen in diesem Abschnitt wird gezeigt, wie mit der OUTPUT-Klausel Informationen bzw. Ausdrücke aus den einzelnen von einer UPDATE-Anweisung betroffenen Zeilen zurückgegeben werden.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an UPDATE statement. Diese Ergebnisse können an die verarbeitende Anwendung zurückgegeben werden, die sie z. B. für Bestätigungen, Archivierungen und andere Anwendungsanforderungen verwendet.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

AA.AA. Verwenden von UPDATE mit der OUTPUT-KlauselUsing UPDATE with the OUTPUT clause

Im folgenden Beispiel wird die Spalte VacationHours in der Tabelle Employee um 25 Prozent für die ersten 10 Zeilen aktualisiert und außerdem der Wert in der Spalte ModifiedDate auf das aktuelle Datum festgelegt.The following example updates the column VacationHours in the Employee table by 25 percent for the first 10 rows and also sets the value in the column ModifiedDate to the current date. Die OUTPUT-Klausel gibt an die VacationHours-Tabellenvariable den Wert für UPDATE zurück, der vor der Anwendung der deleted.VacationHours-Anweisung in der inserted.VacationHours-Spalte vorhanden war, und den aktualisierten Wert in der @MyTableVar-Spalte.The OUTPUT clause returns the value of VacationHours that exists before applying the UPDATE statement in the deleted.VacationHours column and the updated value in the inserted.VacationHours column to the @MyTableVar table variable.

Es folgen zwei SELECT-Anweisungen, die die Werte in @MyTableVar und die Ergebnisse des Updatevorgangs in der Employee-Tabelle zurückgeben.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Weitere Beispiele zur Verwendung der OUTPUT-Klausel finden Sie unter OUTPUT-Klausel (Transact-SQL).For more examples using the OUTPUT clause, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25,  
    ModifiedDate = GETDATE()   
OUTPUT inserted.BusinessEntityID,  
       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.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

Verwenden von UPDATE in anderen AnweisungenUsing UPDATE in other statements

In Beispielen in diesem Abschnitt wird die Verwendung von UPDATE in anderen Anweisungen veranschaulicht.Examples in this section demonstrate how to use UPDATE in other statements.

AB.AB. Verwenden von UPDATE in einer gespeicherten ProzedurUsing UPDATE in a stored procedure

Im folgenden Beispiel wird eine UPDATE-Anweisung in einer gespeicherten Prozedur verwendet.The following example uses an UPDATE statement in a stored procedure. Die Prozedur erfordert den Eingabeparameter @NewHours und den Ausgabeparameter @RowCount.The procedure takes one input parameter, @NewHours and one output parameter @RowCount. Der @NewHours-Parameterwert wird in der UPDATE-Anweisung verwendet, um die Spalte VacationHours in der Tabelle HumanResources.Employee zu aktualisieren.The @NewHours parameter value is used in the UPDATE statement to update the column VacationHours in the table HumanResources.Employee. Der Ausgabeparameter @RowCount wird verwendet, um die Anzahl betroffener Zeilen an eine lokale Variable zurückzugeben.The @RowCount output parameter is used to return the number of rows affected to a local variable. Der CASE-Ausdruck wird in der SET-Klausel verwendet, um den Wert, der für VacationHours festgelegt wird, bedingt zu bestimmen.The CASE expression is used in the SET clause to conditionally determine the value that is set for VacationHours. Wenn der Mitarbeiter pro Stunde bezahlt wird (SalariedFlag = 0), ist VacationHours auf die aktuelle Anzahl der Stunden zuzüglich des Werts festgelegt, der unter @NewHours angegeben ist. Andernfalls ist VacationHours auf den Wert festgelegt, der unter @NewHours angegeben ist.When the employee is paid hourly (SalariedFlag = 0), VacationHours is set to the current number of hours plus the value specified in @NewHours; otherwise, VacationHours is set to the value specified in @NewHours.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE HumanResources.Update_VacationHours  
@NewHours smallint  
AS   
SET NOCOUNT ON;  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours  
         ELSE @NewHours  
       END  
    )  
WHERE CurrentFlag = 1;  
GO  

EXEC HumanResources.Update_VacationHours 40;  

AC.AC. Verwenden von UPDATE in einem TRY...CATCH-BlockUsing UPDATE in a TRY...CATCH Block

Im folgenden Beispiel wird eine UPDATE-Anweisung in einem TRY...CATCH-Block verwendet, um Ausführungsfehler zu behandeln, die während des Updatevorgangs auftreten können.The following example uses an UPDATE statement in a TRY...CATCH block to handle execution errors that may occur during the update operation.

USE AdventureWorks2012;  
GO  
BEGIN TRANSACTION;  

BEGIN TRY  
    -- Intentionally generate a constraint violation error.  
    UPDATE HumanResources.Department  
    SET Name = N'MyNewName'  
    WHERE DepartmentID BETWEEN 1 AND 2;  
END TRY  
BEGIN CATCH  
    SELECT   
         ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  

    IF @@TRANCOUNT > 0  
        ROLLBACK TRANSACTION;  
END CATCH;  

IF @@TRANCOUNT > 0  
    COMMIT TRANSACTION;  
GO  

Beispiele: SQL Data WarehouseSQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse.Examples: SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

AD.AD. Verwenden einer einfachen UPDATE-AnweisungUsing a simple UPDATE statement

Im folgenden Beispiel wird gezeigt, welche Auswirkungen es auf sämtliche Zeilen haben kann, wenn für die Angabe der zu aktualisierenden Zeile (oder Zeilen) keine WHERE-Klausel verwendet wird.The following examples show how all rows can be affected when a WHERE clause is not used to specify the row (or rows) to update.

In diesem Beispiel werden die Werte in den Spalten EndDate und CurrentFlag für alle Zeilen in der Tabelle DimEmployee aktualisiert.This example updates the values in the EndDate and CurrentFlag columns for all rows in the DimEmployee table.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET EndDate = '2010-12-31', CurrentFlag='False';  

Sie können für eine UPDATE-Anweisung auch berechnete Werte verwenden.You can also use computed values in an UPDATE statement. Das folgende Beispiel verdoppelt den Wert in der ListPrice-Spalte für alle Zeilen in der Product-Tabelle.The following example doubles the value in the ListPrice column for all rows in the Product table.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET BaseRate = BaseRate * 2;  

AE.AE. Verwenden der UPDATE-Anweisung mit einer WHERE-KlauselUsing the UPDATE statement with a WHERE clause

Im folgenden Beispiel wird die WHERE-Klausel verwendet, um die zu aktualisierenden Zeilen anzugeben.The following example uses the WHERE clause to specify which rows to update.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET FirstName = 'Gail'  
WHERE EmployeeKey = 500;  

AF.AF. Verwenden der UPDATE-Anweisung mit einer BezeichnungUsing the UPDATE statement with label

Im folgenden Beispiel wird die Verwendung einer Bezeichnung für eine UPDATE-Anweisung gezeigt.The following example shows use of a LABEL for the UPDATE statement.

-- Uses AdventureWorks  

UPDATE DimProduct  
SET ProductSubcategoryKey = 2   
WHERE ProductKey = 313  
OPTION (LABEL = N'label1');  

AG.AG. Verwenden der UPDATE-Anweisung mit Informationen aus einer anderen TabelleUsing the UPDATE statement with information from another table

In diesem Beispiel wird eine Tabelle erstellt, in welcher der Gesamtumsatz nach Jahr gespeichert werden soll.This example creates a table to store total sales by year. Die Gesamtumsätze für das Jahr 2004 werden aktualisiert, indem eine SELECT-Anweisung für die Tabelle „FactInternetSales“ ausgeführt wird.It updates the total sales for the year 2004 by running a SELECT statement against the FactInternetSales table.

-- Uses AdventureWorks  

CREATE TABLE YearlyTotalSales (  
    YearlySalesAmount money NOT NULL,  
    Year smallint NOT NULL )  
WITH ( DISTRIBUTION = REPLICATE );  

INSERT INTO YearlyTotalSales VALUES (0, 2004);  
INSERT INTO YearlyTotalSales VALUES (0, 2005);  
INSERT INTO YearlyTotalSales VALUES (0, 2006);  

UPDATE YearlyTotalSales  
SET YearlySalesAmount=  
(SELECT SUM(SalesAmount) FROM FactInternetSales WHERE OrderDateKey >=20040000 AND OrderDateKey < 20050000)  
WHERE Year=2004;  

SELECT * FROM YearlyTotalSales;   

AH.AH. ANSI-Verknüpfungsersatz für UPDATE-AnweisungenANSI join replacement for update statements

Möglicherweise liegt Ihnen ein komplexes Update vor, bei dem zur Durchführung der UPDATE- oder DELETE-Anweisung mithilfe der ANSI-Verknüpfungssyntax mehr als zwei Tabellen miteinander verknüpft werden.You may find you have a complex update that joins more than two tables together using ANSI joining syntax to perform the UPDATE or DELETE.

Stellen Sie sich vor, dass Sie die folgende Tabelle aktualisieren müssen:Imagine you had to update this table:

CREATE TABLE [dbo].[AnnualCategorySales]
(   [EnglishProductCategoryName]    NVARCHAR(50)    NOT NULL
,   [CalendarYear]                  SMALLINT        NOT NULL
,   [TotalSalesAmount]              MONEY           NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN
)
;  

Die ursprüngliche Abfrage könnte etwa so ausgesehen haben:The original query might have looked something like this:

UPDATE  acs
SET     [TotalSalesAmount] = [fis].[TotalSalesAmount]
FROM    [dbo].[AnnualCategorySales]     AS acs
JOIN    (
        SELECT  [EnglishProductCategoryName]
        ,       [CalendarYear]
        ,       SUM([SalesAmount])              AS [TotalSalesAmount]
        FROM    [dbo].[FactInternetSales]       AS s
        JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
        JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
        JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
        JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
        WHERE   [CalendarYear] = 2004
        GROUP BY
                [EnglishProductCategoryName]
        ,       [CalendarYear]
        ) AS fis
ON  [acs].[EnglishProductCategoryName]  = [fis].[EnglishProductCategoryName]
AND [acs].[CalendarYear]                = [fis].[CalendarYear]
;  

Da SQL Data WarehouseSQL Data Warehouse in der FROM-Klausel einer UPDATE-Anweisung keine ANSI-Verknüpfungen unterstützt, können Sie diesen Code nicht kopieren, ohne ihn leicht zu ändern.Since SQL Data WarehouseSQL Data Warehouse does not support ANSI joins in the FROM clause of an UPDATE statement, you cannot copy this code over without changing it slightly.

Sie können eine Kombination aus einer CTAS-Anweisung und eine implizite Verknüpfung verwenden, um diesen Code zu ersetzen:You can use a combination of a CTAS and an implicit join to replace this code:

-- Create an interim table
CREATE TABLE CTAS_acs
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT  ISNULL(CAST([EnglishProductCategoryName] AS NVARCHAR(50)),0)    AS [EnglishProductCategoryName]
,       ISNULL(CAST([CalendarYear] AS SMALLINT),0)                      AS [CalendarYear]
,       ISNULL(CAST(SUM([SalesAmount]) AS MONEY),0)                     AS [TotalSalesAmount]
FROM    [dbo].[FactInternetSales]       AS s
JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
WHERE   [CalendarYear] = 2004
GROUP BY
        [EnglishProductCategoryName]
,       [CalendarYear]
;

-- Use an implicit join to perform the update
UPDATE  AnnualCategorySales
SET     AnnualCategorySales.TotalSalesAmount = CTAS_ACS.TotalSalesAmount
FROM    CTAS_acs
WHERE   CTAS_acs.[EnglishProductCategoryName] = AnnualCategorySales.[EnglishProductCategoryName]
AND     CTAS_acs.[CalendarYear]               = AnnualCategorySales.[CalendarYear]
;

--Drop the interim table
DROP TABLE CTAS_acs
;

Weitere InformationenSee Also

CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
Cursors (Transact-SQL) Cursors (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
Text- und Bildfunktionen (Transact-SQL) Text and Image Functions (Transact-SQL)
WITH common_table_expression (Transact-SQL) WITH common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)FILESTREAM (SQL Server)