Dela via


UPDATE (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse i Microsoft FabricSQL-databas i Microsoft Fabric

Ändrar befintliga data i en tabell eller vy i SQL Server. Exempel finns i Exempel.

Transact-SQL syntaxkonventioner

Syntax

-- 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 Synapse Analytics and Microsoft Fabric

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

<join_table_source> ::=   
{  
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias 
    [ <tablesample_clause>]  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
}  
-- Syntax for 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 ) ]  
[;]  

Argument

MED <common_table_expression>
Anger den tillfälliga namngivna resultatuppsättningen eller vyn, även kallat common table expression (CTE), som definierats inom omfånget för UPDATE-instruktionen. CTE-resultatuppsättningen härleds från en enkel fråga och refereras av UPDATE-instruktionen.

Vanliga tabelluttryck kan också användas med satserna SELECT, INSERT, DELETE och CREATE VIEW. Mer information finns i WITH common_table_expression (Transact-SQL).

TOP (uttryck) [ PERCENT ]
Anger antalet eller procent av raderna som uppdateras. uttryck kan vara antingen ett tal eller en procent av raderna.

Raderna som refereras i TOP-uttrycket som används med INSERT, UPDATE eller DELETE ordnas inte i någon ordning.

Parenteser som avgränsar uttryck i TOP krävs i INSERT-, UPDATE- och DELETE-uttryck. Mer information finns i TOP (Transact-SQL).

table_alias
Aliaset som anges i UPDATE-satsen som representerar tabellen eller vyn som raderna ska uppdateras från.

server_name
Är namnet på servern (med ett länkat servernamn eller OPENDATASOURCE- funktion som servernamn) som tabellen eller vyn finns på. Om server_name anges krävs database_name och schema_name.

database_name
Är namnet på databasen.

schema_name
Är namnet på schemat som tabellen eller vyn tillhör.

table_or_view_name
Är namnet på tabellen eller vyn som raderna ska uppdateras från. Vyn som refereras av table_or_view_name måste vara uppdaterad och referera till exakt en bastabell i FROM-satsen i vyn. Mer information om uppdateringsbara vyer finns i CREATE VIEW (Transact-SQL).

rowset_function_limited
Är antingen funktionen OPENQUERY eller OPENROWSET, beroende på providerfunktioner.

MED (<Table_Hint_Limited>)
Anger en eller flera tabelltips som tillåts för en måltabell. Nyckelordet WITH och parenteserna krävs. NOLOCK, READUNCOMMITTED, NOEXPAND och flera andra tillåts inte. Information om tabelltips finns i Tabelltips (Transact-SQL).

@ table_variable
Anger en tabell variabel som tabellkälla.

STÄLLA
Anger listan med kolumn- eller variabelnamn som ska uppdateras.

column_name
Är en kolumn som innehåller de data som ska ändras. column_name måste finnas i table_or view_name. Det går inte att uppdatera identitetskolumner.

uttryck
Är en variabel, literalvärde, uttryck eller en undermarkeringsinstruktur (omgiven med parenteser) som returnerar ett enda värde. Värdet som returneras av uttryck ersätter det befintliga värdet i column_name eller @variabeln.

Not

När du refererar till Unicode-teckendatatyperna nchar, nvarcharoch ntextska uttrycket prefixeras med versaler bokstaven "N". Om "N" inte har angetts konverterar SQL Server strängen till den kodsida som motsvarar standardsortering av databasen eller kolumnen. Alla tecken som inte hittas på den här kodsidan går förlorade.

STANDARD
Anger att standardvärdet som definierats för kolumnen är att ersätta det befintliga värdet i kolumnen. Detta kan också användas för att ändra kolumnen till NULL om kolumnen inte har något standardvärde och har definierats för att tillåta null-värden.

{ += | -= | *= | /= | %= | &= | ^= | |= }
Sammansatt tilldelningsoperator:
+= Lägg till och tilldela
-= Subtrahera och tilldela
*= Multiplicera och tilldela
/= Dela upp och tilldela
%= Modulo och tilldela
&= Bitvis OCH och tilldela
^= Bitwise XOR och tilldela
|= Bitvis ELLER och tilldela

udt_column_name
Är en användardefinierad typkolumn.

property_name | field_name
Är en offentlig egenskap eller medlem av offentliga data av en användardefinierad typ.

method_name(argument [ ,... n] )
Är en ickestatisk offentlig mutatormetod för udt_column_name som tar ett eller flera argument.

.WRITE (expression,@Offset,@Length)
Anger att ett avsnitt av värdet för column_name ska ändras. uttryck ersätter @Length enheter från och med @Offset för column_name. Endast kolumner med varchar(max), nvarchar(max)eller varbinary(max) kan anges med den här satsen. column_name kan inte vara NULL och kan inte kvalificeras med ett tabellnamn eller tabellalias.

uttryck är värdet som kopieras till column_name. uttryck måste utvärderas till eller kunna omvandlas implicit till den column_name typen. Om uttryck är inställt på NULL ignoreras @Length och värdet i column_name trunkeras vid angiven @Offset.

@ Offset är startpunkten i värdet som lagras i column_name där uttryck skrivs. @ Offset är en nollbaserad ordningstalsbyteposition, är bigint-och kan inte vara ett negativt tal. Om @Offset är NULL läggs uppdateringsåtgärden till uttryck i slutet av det befintliga column_name-värdet och @Length ignoreras. Om @Offset är större än bytelängden för värdet column_name returnerar databasmotorn ett fel. Om @Offset plus @Length överskrider slutet av det underliggande värdet i kolumnen, sker borttagningen upp till det sista tecknet för värdet.

@ Längd är längden på avsnittet i kolumnen, med början från @Offset, som ersätts av uttryck. @ Längd är bigint och kan inte vara ett negativt tal. Om @Length är NULL, tar uppdateringsåtgärden bort alla data från @Offset till slutet av column_name-värdet.

Mer information finns i Uppdatera datatyper för stora värden.

@ variabel
Är en deklarerad variabel som är inställd på värdet som returneras av uttryck.

ANGE @variabel = kolumn = uttryck anger variabeln till samma värde som kolumnen. Detta skiljer sig från SET @variabel = kolumn, kolumn = uttryck, som anger variabeln till värdet för föruppdatering av kolumnen.

<OUTPUT_Clause>
Returnerar uppdaterade data eller uttryck baserat på dem som en del av UPDATE-åtgärden. OUTPUT-satsen stöds inte i DML-instruktioner som riktar sig mot fjärrtabeller eller vyer. Mer information om argumenten och beteendet för den här satsen finns i OUTPUT-satsen (Transact-SQL).

FRÅN <table_source>
Anger att en tabell, vy eller härledd tabellkälla används för att ange kriterierna för uppdateringsåtgärden. Mer information finns i FROM (Transact-SQL).

Om objektet som uppdateras är detsamma som objektet i FROM-satsen och det bara finns en referens till objektet i FROM-satsen kan ett objektalias anges. Om objektet som uppdateras visas mer än en gång i FROM-satsen, en och endast en, får referensen till objektet inte ange ett tabellalias. Alla andra referenser till objektet i FROM-satsen måste innehålla ett objektalias.

En vy med utlösaren I stället för UPPDATERING kan inte vara ett mål för en UPDATE med en FROM-sats.

Not

Alla anrop till OPENDATASOURCE, OPENQUERY eller OPENROWSET i FROM-satsen utvärderas separat och oberoende av alla anrop till dessa funktioner som används som mål för uppdateringen, även om identiska argument levereras till de två anropen. I synnerhet har filter- eller kopplingsvillkor som tillämpas på resultatet av ett av dessa anrop ingen effekt på resultatet av det andra.

VAR
Anger de villkor som begränsar de rader som uppdateras. Det finns två former av uppdatering baserat på vilken form av WHERE-satsen som används:

  • Genomsökda uppdateringar anger ett sökvillkor för att kvalificera raderna som ska tas bort.

  • Positionerade uppdateringar använder CURRENT OF-satsen för att ange en markör. Uppdateringsåtgärden sker på markörens aktuella position.

<search_condition>
Anger villkoret som ska uppfyllas för de rader som ska uppdateras. Sökvillkoret kan också vara det villkor som en koppling baseras på. Det finns ingen gräns för antalet predikat som kan ingå i ett sökvillkor. Mer information om predikat och sökvillkor finns i Sökvillkor (Transact-SQL).

AKTUELL FÖR
Anger att uppdateringen utförs på den aktuella positionen för den angivna markören.

En positionerad uppdatering med en WHERE CURRENT OF-sats uppdaterar den enskilda raden vid markörens aktuella position. Detta kan vara mer exakt än en genomsökt uppdatering som använder en WHERE-<search_condition>-sats för att kvalificera raderna som ska uppdateras. En genomsökt uppdatering ändrar flera rader när sökvillkoret inte unikt identifierar en enskild rad.

GLOBAL
Anger att cursor_name refererar till en global markör.

cursor_name
Är namnet på den öppna markören som hämtningen ska göras från. Om både en global och en lokal markör med namnet cursor_name finns refererar det här argumentet till den globala markören om GLOBAL anges. annars refererar den till den lokala markören. Markören måste tillåta uppdateringar.

cursor_variable_name
Är namnet på en markörvariabel. cursor_variable_name måste referera till en markör som tillåter uppdateringar.

ALTERNATIV (<query_hint> [ ,... n ] )
Anger att optimerartips används för att anpassa hur databasmotorn bearbetar -instruktionen. Mer information finns i Frågetips (Transact-SQL).

Metodtips

Använd funktionen @@ROWCOUNT för att returnera antalet infogade rader till klientprogrammet. Mer information finns i @@ROWCOUNT (Transact-SQL).

Variabelnamn kan användas i UPDATE-instruktioner för att visa de gamla och nya värden som påverkas, men detta bör endast användas när UPDATE-instruktionen påverkar en enskild post. Om UPDATE-instruktionen påverkar flera poster använder du OUTPUT-instruktionenför att returnera de gamla och nya värdena för varje post.

Var försiktig när du anger FROM-satsen för att ange kriterierna för uppdateringsåtgärden. Resultatet av en UPDATE-instruktion är odefinierat om -instruktionen innehåller en FROM-sats som inte har angetts på ett sådant sätt att endast ett värde är tillgängligt för varje kolumnhändelse som uppdateras, dvs. om UPDATE-instruktionen inte är deterministisk. I UPDATE-instruktionen i följande skript uppfyller till exempel båda raderna i Table1 kvalifikationerna för FROM-satsen i UPDATE-instruktionen. men det är odefinierat vilken rad från Table1 som används för att uppdatera raden i Table2.

USE AdventureWorks2022;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') isn't NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') isn't 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;  

Samma problem kan uppstå när FROM- och WHERE CURRENT OF-satserna kombineras. I följande exempel uppfyller båda raderna i Table2 kvalifikationerna för FROM-satsen i UPDATE-instruktionen. Det är odefinierat vilken rad från Table2 ska användas för att uppdatera raden i Table1.

USE AdventureWorks2022;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') isn't NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') isn't 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  

Stöd för kompatibilitet

Stöd för användning av READUNCOMMITTED- och NOLOCK-tipsen i FROM-satsen som gäller för måltabellen för en UPDATE- eller DELETE-instruktion tas bort i en framtida version av SQL Server. Undvik att använda dessa tips i den här kontexten i nytt utvecklingsarbete och planera att ändra program som för närvarande använder dem.

Datatyper

Alla tecken och nchar kolumner är höger vadderade till den definierade längden.

Om ANSI_PADDING är inställt på AV tas alla avslutande blanksteg bort från data som infogas i varchar och nvarchar kolumner, förutom i strängar som bara innehåller blanksteg. Dessa strängar trunkeras till en tom sträng. Om ANSI_PADDING är inställt på PÅ infogas avslutande blanksteg. Microsoft SQL Server ODBC-drivrutinen och OLE DB-providern för SQL Server anger automatiskt ANSI_PADDING PÅ för varje anslutning. Detta kan konfigureras i ODBC-datakällor eller genom att ange anslutningsattribut eller egenskaper. Mer information finns i SET ANSI_PADDING (Transact-SQL).

Uppdatera text-, ntext- och bildkolumner

Om du ändrar en text, ntexteller bild kolumn med UPDATE initieras kolumnen, tilldelas en giltig textpekare till den och minst en datasida allokeras, såvida inte kolumnen uppdateras med NULL.

Om du vill ersätta eller ändra stora block med text, ntexteller bild data använder du WRITETEXT eller UPDATETEXT i stället för UPDATE-instruktionen.

Om UPDATE-instruktionen kan ändra mer än en rad vid uppdatering av både klusternyckeln och en eller flera text, ntexteller bild kolumner, körs den partiella uppdateringen av dessa kolumner som en fullständig ersättning av värdena.

Viktig

ntext, textoch bild datatyper tas bort i en framtida version av Microsoft SQL Server. Undvik att använda dessa datatyper i det nya utvecklingsarbetet och planera att ändra program som för närvarande använder dem. Använd nvarchar(max), varchar(max)och varbinary(max) i stället.

Uppdatera datatyper med stora värden

Använd .WRITE (expression,@Offset,@Length)-sats för att utföra en partiell eller fullständig uppdatering av varchar(max), nvarchar(max)och varbinary(max) datatyper.

Till exempel kan en partiell uppdatering av en varchar(max) kolumn ta bort eller ändra endast de första 200 byteen av kolumnen (200 tecken om du använder ASCII-tecken), medan en fullständig uppdatering skulle ta bort eller ändra alla data i kolumnen. . SKRIV uppdateringar som infogar eller lägger till nya data loggas minimalt om databasåterställningsmodellen är inställd på massloggad eller enkel. Minimal loggning används inte när befintliga värden uppdateras. Mer information finns i Transaktionsloggen (SQL Server).

Databasmotorn konverterar en partiell uppdatering till en fullständig uppdatering när UPDATE-instruktionen orsakar någon av följande åtgärder:

  • Ändrar en nyckelkolumn i den partitionerade vyn eller tabellen.
  • Ändrar mer än en rad och uppdaterar även nyckeln för ett icke-substantivt grupperat index till ett icke-stant värde.

Du kan inte använda . SKRIV-sats för att uppdatera en NULL-kolumn eller ange värdet för column_name till NULL.

@ Offset och @Length anges i byte för varbinary och varchar datatyper och i byte-par för nvarchar datatyp. Mer information om längd på strängdatatyper finns i char och varchar (Transact-SQL) och nchar och nvarchar (Transact-SQL).

För bästa prestanda rekommenderar vi att data infogas eller uppdateras i segmentstorlekar som är multiplar på 8 040 byte.

Om kolumnen har ändrats av . WRITE-satsen refereras i en OUTPUT-sats, kolumnens fullständiga värde, antingen före-bilden i borttagen.column_name eller efterbilden i infogad.column_namereturneras till den angivna kolumnen i tabellvariabeln. Se exempel R som följer.

För att uppnå samma funktioner i . Skriv med andra tecken eller binära datatyper, använd STUFF (Transact-SQL).

Uppdatera kolumner av användardefinierad typ

Du kan uppdatera värden i användardefinierade typkolumner på något av följande sätt:

  • Ange ett värde i en SQL Server-systemdatatyp, så länge den användardefinierade typen stöder implicit eller explicit konvertering från den typen. I följande exempel visas hur du uppdaterar ett värde i en kolumn av användardefinierad typ Pointgenom att uttryckligen konvertera från en sträng.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • Anropa en metod, markerad som en mutator, av användardefinierad typ, för att utföra uppdateringen. I följande exempel anropas en mutatormetod av typen Point med namnet SetXY. Detta uppdaterar tillståndet för instansen av typen.

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

    Not

    SQL Server returnerar ett fel om en mutatormetod anropas på ett Transact-SQL null-värde, eller om ett nytt värde som genereras av en mutatormetod är null.

  • Ändra värdet för en registrerad egenskap eller medlem av offentliga data av den användardefinierade typen. Uttrycket som anger värdet måste implicit konverteras till egenskapens typ. I följande exempel ändras värdet för egenskapen X av användardefinierad typ Point.

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

    Om du vill ändra olika egenskaper för samma användardefinierade typkolumn utfärdar du flera UPDATE-instruktioner eller anropar en mutatormetod av typen.

Uppdatera FILESTREAM-data

Du kan använda UPDATE-instruktionen för att uppdatera ett FILESTREAM-fält till ett null-värde, ett tomt värde eller en relativt liten mängd infogade data. En stor mängd data strömmas dock mer effektivt till en fil med hjälp av Win32-gränssnitt. När du uppdaterar ett FILESTREAM-fält ändrar du underliggande BLOB-data i filsystemet. När ett FILESTREAM-fält är inställt på NULL tas de BLOB-data som är associerade med fältet bort. Du kan inte använda . WRITE(), för att utföra partiella uppdateringar av FILESTREAM-data. Mer information finns i FILESTREAM (SQL Server).

Felhantering

Om en uppdatering av en rad bryter mot en begränsning eller regel, bryter mot NULL-inställningen för kolumnen eller om det nya värdet är en inkompatibel datatyp avbryts instruktionen, ett fel returneras och inga poster uppdateras.

När en UPDATE-instruktion stöter på ett aritmetikfel (spill, dividera med noll eller ett domänfel) under uttrycksutvärderingen utförs inte uppdateringen. Resten av batchen körs inte och ett felmeddelande returneras.

Om en uppdatering av en kolumn eller kolumner som deltar i ett grupperat index orsakar storleken på det klustrade indexet och raden överskrider 8 060 byte, misslyckas uppdateringen och ett felmeddelande returneras.

Samverkan

UPDATE-instruktioner tillåts endast i brödtexten för användardefinierade funktioner om tabellen som ändras är en tabellvariabel.

När en INSTEAD OF utlösare definieras för UPDATE-åtgärder mot en tabell körs utlösaren i stället för UPDATE-instruktionen. Tidigare versioner av SQL Server stöder endast AFTER-utlösare som definierats i UPDATE- och andra datamodifieringsinstruktioner. FROM-satsen kan inte anges i en UPDATE-instruktion som refererar till, antingen direkt eller indirekt, en vy med en INSTEAD OF utlösare som definierats på den. Mer information om I stället för utlösare finns i CREATE TRIGGER (Transact-SQL).

För närvarande kan INTE FROM-satsen anges i en UPDATE-instruktion på Warehouse i Microsoft Fabric. Update-instruktioner för en tabell stöds.

Begränsningar och begränsningar

FROM-satsen kan inte anges i en UPDATE-instruktion som refererar till, antingen direkt eller indirekt, en vy som har en INSTEAD OF utlösare definierad på den. Mer information om INSTEAD OF utlösare finns i CREATE TRIGGER (Transact-SQL).

När ett vanligt tabelluttryck (CTE) är målet för en UPDATE-instruktion måste alla referenser till CTE i -instruktionen matcha. Om till exempel CTE tilldelas ett alias i FROM-satsen måste aliaset användas för alla andra referenser till CTE. Entydiga CTE-referenser krävs eftersom en CTE inte har något objekt-ID, vilket SQL Server använder för att identifiera den implicita relationen mellan ett objekt och dess alias. Utan den här relationen kan frågeplanen skapa oväntat kopplingsbeteende och oavsiktliga frågeresultat. I följande exempel visas korrekta och felaktiga metoder för att ange en CTE när CTE är målobjektet för uppdateringsåtgärden.

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  

Här är resultatuppsättningen.

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

UPDATE-instruktion med CTE-referenser som är felaktigt matchade.

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 isn't 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  

Här är resultatuppsättningen.

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

Låsningsbeteende

En UPDATE-instruktion hämtar ett exklusivt (X) lås på alla rader som den ändrar och håller dessa lås tills transaktionen har slutförts. Beroende på frågeplanen för UPDATE-instruktionen, antalet rader som ändras och transaktionens isoleringsnivå kan lås hämtas på sidnivå eller tabellnivå i stället för på radnivå. För att undvika dessa lås på högre nivå bör du överväga att dela upp uppdateringssatser som påverkar tusentals rader eller mer i batchar och se till att eventuella kopplings- och filtervillkor stöds av index. Mer information om hur du låser mekanik i SQL Server finns i artikeln om låsning i databasmotorn.

Om optimerad låsning är aktiverat kan vissa aspekter av låsningsbeteendet för UPDATE ändras. Till exempel hålls inte exklusiva lås (X) förrän transaktionen har slutförts. Mer information finns i Optimerad låsning.

Loggningsbeteende

UPDATE-instruktionen loggas. Partiella uppdateringar av datatyper med stora värden med hjälp av . Skriv--satsen loggas minimalt. Mer information finns i "Uppdatera datatyper med stora värden" i det tidigare avsnittet "Datatyper".

Säkerhet

Behörigheter

UPDATE behörigheter krävs i måltabellen. SELECT behörigheter krävs också för tabellen som uppdateras om UPDATE-instruktionen innehåller en WHERE-sats, eller om uttryck i SET-satsen använder en kolumn i tabellen.

UPPDATERA behörigheter som standard för medlemmar i den sysadmin fasta serverrollen, db_owner och db_datawriter fasta databasroller och tabellägaren. Medlemmar i rollerna sysadmin, db_owneroch db_securityadmin och tabellägaren kan överföra behörigheter till andra användare.

Exempel

Kategori Aktuella syntaxelement
Grundläggande syntax UPPDATERA
begränsa de rader som uppdateras WHERE * TOP * WITH common table expression * WHERE CURRENT OF
ange kolumnvärden beräknade värden * sammansatta operatorer * standardvärden * underfrågor
ange andra målobjekt än standardtabeller vyer * tabellvariabler * tabellalias
uppdatera data baserat på data från andra tabeller FRÅN
uppdatera rader i en fjärrtabell länkad server * OPENQUERY * OPENDATASOURCE
uppdatera stora objektdatatyper . SKRIV * OPENROWSET
Uppdatera användardefinierade typer användardefinierade typer
åsidosätta standardbeteendet för frågeoptimeraren med hjälp av tips tabelltips * frågetips
samla in resultatet av UPDATE-instruktionen OUTPUT-sats
Använda UPDATE i andra instruktioner Lagrade procedurer * TRY... FÅNGA

Grundläggande syntax

Exempel i det här avsnittet visar de grundläggande funktionerna i UPDATE-instruktionen med hjälp av den minsta syntax som krävs.

A. Använda en enkel UPDATE-instruktion

I följande exempel uppdateras en enda kolumn för alla rader i tabellen Person.Address.

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

B. Uppdatera flera kolumner

I följande exempel uppdateras värdena i kolumnerna Bonus, CommissionPctoch SalesQuota för alla rader i tabellen SalesPerson.

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

Begränsa de rader som uppdateras

Exempel i det här avsnittet visar hur du kan använda för att begränsa antalet rader som påverkas av UPDATE-instruktionen.

C. Använda WHERE-satsen

I följande exempel används WHERE-satsen för att ange vilka rader som ska uppdateras. Instruktionen uppdaterar värdet i kolumnen Color i den Production.Product tabellen för alla rader som har ett befintligt värde av "Red" i kolumnen Color och har ett värde i kolumnen Name som börjar med "Road-250".

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

D. Använda TOP-satsen

I följande exempel används TOP-satsen för att begränsa antalet rader som ändras i en UPDATE-instruktion. När en TOP-sats (n) används med UPDATE utförs uppdateringsåtgärden på ett slumpmässigt urval av "n" antal rader. I följande exempel uppdateras kolumnen VacationHours med 25 procent för 10 slumpmässiga rader i tabellen Employee.

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

Om du måste använda TOP för att tillämpa uppdateringar i en meningsfull kronologi måste du använda TOP tillsammans med ORDER BY i en undermarkeringssats. I följande exempel uppdateras semestertimmarna för de 10 anställda med de tidigaste anställningsdatumen.

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. Använda WITH common_table_expression-satsen

I följande exempel uppdateras värdet för PerAssemblyQty för alla delar och komponenter som används direkt eller indirekt för att skapa ProductAssemblyID 800. Det gemensamma tabelluttrycket returnerar en hierarkisk lista över delar som används direkt för att skapa ProductAssemblyID 800 och delar som används för att bygga dessa komponenter och så vidare. Endast de rader som returneras av det gemensamma tabelluttrycket ändras.

USE AdventureWorks2022;  
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. Använda WHERE CURRENT OF-satsen

I följande exempel används WHERE CURRENT OF-satsen för att endast uppdatera raden där markören är placerad. När en markör baseras på en koppling ändras endast de table_name som anges i UPDATE-instruktionen. Andra tabeller som deltar i markören påverkas inte.

USE AdventureWorks2022;  
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  

Ange kolumnvärden

Exempel i det här avsnittet visar hur du uppdaterar kolumner med hjälp av beräknade värden, underfrågor och STANDARDvärden.

G. Ange ett beräknat värde

I följande exempel används beräknade värden i en UPDATE-instruktion. Exemplet fördubblar värdet i kolumnen ListPrice för alla rader i tabellen Product.

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

H. Ange en sammansatt operator

I följande exempel används variabeln @NewPrice för att öka priset på alla röda cyklar genom att ta det aktuella priset och lägga till 10 till den.

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

I följande exempel används den sammansatta operatorn += för att lägga till data ' - tool malfunction' till det befintliga värdet i kolumnen Name för rader som har en ScrapReasonID mellan 10 och 12.

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

Jag. Ange en underfråga i SET-satsen

I följande exempel används en underfråga i SET-satsen för att fastställa det värde som används för att uppdatera kolumnen. Underfrågan får endast returnera ett skalärt värde (det vill: ett enda värde per rad). I exemplet ändras kolumnen SalesYTD i tabellen SalesPerson så att den återspeglar den senaste försäljningen som registrerats i tabellen SalesOrderHeader. Underfrågan aggregerar försäljningen för varje säljare i UPDATE-instruktionen.

USE AdventureWorks2022;  
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. Uppdatera rader med standardvärden

I följande exempel anges kolumnen CostRate till standardvärdet (0,00) för alla rader som har ett CostRate värde som är större än 20.00.

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

Ange andra målobjekt än standardtabeller

Exempel i det här avsnittet visar hur du uppdaterar rader genom att ange en vy, ett tabellalias eller en tabellvariabel.

K. Ange en vy som målobjekt

I följande exempel uppdateras rader i en tabell genom att en vy anges som målobjekt. Vydefinitionen refererar dock till flera tabeller, men UPDATE-instruktionen lyckas eftersom den refererar till kolumner från endast en av de underliggande tabellerna. UPDATE-instruktionen misslyckas om kolumner från båda tabellerna har angetts. Mer information finns i Ändra data via en vy.

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

L. Ange ett tabellalias som målobjekt

I följande exempel uppdateras rader i tabellen Production.ScrapReason. Tabellaliaset som tilldelats ScrapReason i FROM-satsen anges som målobjekt i UPDATE-satsen.

USE AdventureWorks2022;  
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. Ange en tabellvariabel som målobjekt

I följande exempel uppdateras rader i en tabellvariabel.

USE AdventureWorks2022;  
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  

Uppdatera data baserat på data från andra tabeller

Exempel i det här avsnittet visar metoder för att uppdatera rader från en tabell baserat på information i en annan tabell.

N. Använda UPDATE-instruktionen med information från en annan tabell

I följande exempel ändras kolumnen SalesYTD i tabellen SalesPerson så att den återspeglar den senaste försäljningen som registrerats i tabellen SalesOrderHeader.

USE AdventureWorks2022;  
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  

I föregående exempel förutsätts att endast en försäljning registreras för en angiven säljare vid ett visst datum och att uppdateringarna är aktuella. Om fler än en försäljning för en angiven säljare kan registreras samma dag fungerar inte exemplet som visas korrekt. Exemplet körs utan fel, men varje SalesYTD värde uppdateras med endast en försäljning, oavsett hur många försäljningar som faktiskt skedde den dagen. Det beror på att en enda UPDATE-instruktion aldrig uppdaterar samma rad två gånger.

I den situation där fler än en försäljning för en angiven säljare kan ske samma dag, måste all försäljning för varje säljare aggregeras tillsammans i UPDATE-instruktionen, som visas i följande exempel:

USE AdventureWorks2022;  
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  

Uppdatera rader i en fjärrtabell

Exempel i det här avsnittet visar hur du uppdaterar rader i en fjärrmåltabell med hjälp av en länkad server eller en raduppsättningsfunktion för att referera till fjärrtabellen.

O. Uppdatera data i en fjärrtabell med hjälp av en länkad server

I följande exempel uppdateras en tabell på en fjärrserver. Exemplet börjar med att skapa en länk till fjärrdatakällan med hjälp av sp_addlinkedserver. Det länkade servernamnet, MyLinkedServer, anges sedan som en del av objektnamnet i fyra delar i formuläret server.catalog.schema.object. Observera att du måste ange ett giltigt servernamn för @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'AdventureWorks2022';  
GO  
USE AdventureWorks2022;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
UPDATE MyLinkedServer.AdventureWorks2022.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

P. Uppdatera data i en fjärrtabell med funktionen OPENQUERY

I följande exempel uppdateras en rad i en fjärrtabell genom att ange funktionen OPENQUERY rowset. Det länkade servernamnet som skapades i föregående exempel används i det här exemplet.

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

Q. Uppdatera data i en fjärrtabell med funktionen OPENDATASOURCE

I följande exempel uppdateras en rad i en fjärrtabell genom att ange funktionen OPENDATASOURCE rowset. Ange ett giltigt servernamn för datakällan med hjälp av formatet server_name eller server_name\instance_name. Du kan behöva konfigurera instansen av SQL Server för ad hoc-distribuerade frågor. Mer information finns i ad hoc-distribuerade frågor Serverkonfigurationsalternativ.

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

Uppdatera datatyper för stora objekt

Exempel i det här avsnittet visar metoder för att uppdatera värden i kolumner som definieras med stora objektdatatyper (LOB).

R. Använda UPDATE med . SKRIV för att ändra data i en nvarchar(max)-kolumn

I följande exempel används . WRITE-sats för att uppdatera ett partiellt värde i DocumentSummary, en nvarchar(max) kolumn i tabellen Production.Document. Ordet components ersätts med ordet features genom att ange ersättningsordet, startplatsen (förskjutningen) för ordet som ska ersättas i befintliga data och antalet tecken som ska ersättas (längd). Exemplet använder också OUTPUT-satsen för att returnera före- och efterbilderna av kolumnen DocumentSummary till @MyTableVar tabellvariabeln.

USE AdventureWorks2022;  
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. Använda UPDATE med . SKRIV för att lägga till och ta bort data i en nvarchar(max)-kolumn

Följande exempel lägger till och tar bort data från en nvarchar(max) kolumn som har ett värde som för närvarande är inställt på NULL. Eftersom . WRITE-satsen kan inte användas för att ändra en NULL-kolumn. Kolumnen fylls först i med tillfälliga data. Dessa data ersätts sedan med rätt data med hjälp av . WRITE-sats. De ytterligare exemplen lägger till data i slutet av kolumnvärdet, tar bort (trunkerar) data från kolumnen och tar slutligen bort partiella data från kolumnen. SELECT-uttrycken visar dataändringen som genereras av varje UPDATE-instruktion.

USE AdventureWorks2022;  
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. Använda UPDATE med OPENROWSET för att ändra en kolumn med varbinary(max)

I följande exempel ersätts en befintlig avbildning som lagras i en varbinary(max) kolumn med en ny bild. Funktionen OPENROWSET används med alternativet BULK för att läsa in bilden i kolumnen. Det här exemplet förutsätter att en fil med namnet Tires.jpg finns i den angivna filsökvägen.

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

U. Använda UPDATE för att ändra FILESTREAM-data

I följande exempel används UPDATE-instruktionen för att ändra data i filsystemfilen. Vi rekommenderar inte den här metoden för att strömma stora mängder data till en fil. Använd lämpliga Win32-gränssnitt. I följande exempel ersätts all text i filposten med texten Xray 1. Mer information finns i FILESTREAM (SQL Server).

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

Uppdatera användardefinierade typer

I följande exempel ändras värden i CLR-kolumner av användardefinierad typ (UDT). Tre metoder demonstreras. Mer information om användardefinierade kolumner finns i CLR User-Defined Types.

V. Använda en systemdatatyp

Du kan uppdatera en UDT genom att ange ett värde i en SQL Server-systemdatatyp, förutsatt att den användardefinierade typen stöder implicit eller explicit konvertering från den typen. I följande exempel visas hur du uppdaterar ett värde i en kolumn av användardefinierad typ Pointgenom att uttryckligen konvertera från en sträng.

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

W. Anropa en metod

Du kan uppdatera en UDT genom att anropa en metod, markerad som en mutator, av användardefinierad typ, för att utföra uppdateringen. I följande exempel anropas en mutatormetod av typen Point med namnet SetXY. Detta uppdaterar tillståndet för instansen av typen.

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

X. Ändra värdet för en egenskap eller datamedlem

Du kan uppdatera en UDT genom att ändra värdet för en registrerad egenskap eller en offentlig datamedlem av den användardefinierade typen. Uttrycket som anger värdet måste implicit konverteras till egenskapens typ. I följande exempel ändras värdet för egenskapen X av användardefinierad typ Point.

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

Åsidosätta standardbeteendet för frågeoptimeraren med hjälp av tips

Exempel i det här avsnittet visar hur du använder tabell- och frågetips för att tillfälligt åsidosätta standardbeteendet för frågeoptimeraren när du bearbetar UPDATE-instruktionen.

Försiktighet

Eftersom SQL Server-frågeoptimeraren vanligtvis väljer den bästa körningsplanen för en fråga rekommenderar vi att tips endast används som en sista utväg av erfarna utvecklare och databasadministratörer.

Y. Ange ett tabelltips

I följande exempel anges tabelltips TABLOCK. Det här tipset anger att ett delat lås tas på tabellen Production.Product och hålls kvar till slutet av UPDATE-instruktionen.

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

Z. Ange ett frågetips

I följande exempel anges frågetipsOPTIMIZE FOR (@variable) i UPDATE-instruktionen. Det här tipset instruerar frågeoptimeraren att använda ett visst värde för en lokal variabel när frågan kompileras och optimeras. Värdet används endast under frågeoptimering och inte under frågekörningen.

USE AdventureWorks2022;  
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-%';  

Samla in resultatet av UPDATE-instruktionen

Exempel i det här avsnittet visar hur du använder OUTPUT-satsen för att returnera information från, eller uttryck baserat på, varje rad som påverkas av en UPDATE-instruktion. Dessa resultat kan returneras till bearbetningsprogrammet för användning i till exempel bekräftelsemeddelanden, arkivering och andra programkrav.

AA. Använda UPDATE med output-satsen

I följande exempel uppdateras kolumnen VacationHours i tabellen Employee med 25 procent för Anställda med mindre än 10 VacationHours och anger även värdet i kolumnen ModifiedDate till det aktuella datumet. Satsen OUTPUT returnerar värdet för VacationHours som finns innan du tillämpar UPDATE-instruktionen i kolumnen deleted.VacationHours och det uppdaterade värdet i kolumnen inserted.VacationHours@MyTableVar tabellvariabeln.

Två SELECT instruktioner följer som returnerar värdena i @MyTableVar och resultatet av uppdateringsåtgärden i tabellen Employee. Fler exempel som använder OUTPUT-satsen finns i OUTPUT-satsen (Transact-SQL).

USE AdventureWorks2022;  
GO  

--Display the initial data of the table to be updated.  
SELECT BusinessEntityID, VacationHours, ModifiedDate, HireDate  
FROM HumanResources.Employee
WHERE VacationHours < 10  
GO  

DECLARE @MyTableVar TABLE (  
    EmpID int NOT NULL,  
    OldVacationHours smallint,  
    NewVacationHours smallint,  
    ModifiedDate datetime);  
UPDATE HumanResources.Employee  
SET VacationHours =  VacationHours * 1.25,  
    ModifiedDate = GETDATE()   
OUTPUT inserted.BusinessEntityID,  
      deleted.VacationHours,  
      inserted.VacationHours,  
      inserted.ModifiedDate  
INTO @MyTableVar
    WHERE VacationHours < 10  
--Display the result set of the table variable.  
SELECT EmpID, OldVacationHours
, NewVacationHours, ModifiedDate  
FROM @MyTableVar;  

GO  
--Display the result set of the table.  
SELECT BusinessEntityID, VacationHours, ModifiedDate, HireDate  
FROM HumanResources.Employee
    WHERE VacationHours < 10  
GO  

Använda UPDATE i andra instruktioner

Exempel i det här avsnittet visar hur du använder UPDATE i andra instruktioner.

AB. Använda UPDATE i en lagrad procedur

I följande exempel används en UPDATE-instruktion i en lagrad procedur. Proceduren tar en indataparameter, @NewHoursoch en utdataparameter @RowCount. Parametervärdet @NewHours används i UPDATE-instruktionen för att uppdatera kolumnen VacationHours i tabellen HumanResources.Employee. Parametern @RowCount utdata används för att returnera antalet rader som påverkas till en lokal variabel. CASE-uttrycket används i SET-satsen för att villkorligt fastställa värdet som har angetts för VacationHours. När medarbetaren betalas varje timme (SalariedFlag = 0) anges VacationHours till det aktuella antalet timmar plus det värde som anges i @NewHours; annars anges VacationHours till det värde som anges i @NewHours.

USE AdventureWorks2022;  
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. Använder UPDATE i ett TRY... CATCH-block

I följande exempel används en UPDATE-instruktion i en TRY... CATCH-block för att hantera körningsfel som kan inträffa under uppdateringsåtgärden.

USE AdventureWorks2022;  
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  

Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)

REKLAM. Använda en enkel UPDATE-instruktion

Följande exempel visar hur alla rader kan påverkas när en WHERE-sats inte används för att ange den rad (eller rader) som ska uppdateras.

I det här exemplet uppdateras värdena i kolumnerna EndDate och CurrentFlag för alla rader i tabellen DimEmployee.

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

Du kan också använda beräknade värden i en UPDATE-instruktion. I följande exempel fördubblas värdet i kolumnen ListPrice för alla rader i tabellen Product.

-- Uses AdventureWorks  
  
UPDATE DimEmployee  
SET BaseRate = BaseRate * 2;  

Æ. Använda UPDATE-instruktionen med en WHERE-sats

I följande exempel används WHERE-satsen för att ange vilka rader som ska uppdateras.

-- Uses AdventureWorks  
  
UPDATE DimEmployee  
SET FirstName = 'Gail'  
WHERE EmployeeKey = 500;  

AF. Använda UPDATE-instruktionen med etikett

I följande exempel visas användningen av en ETIKETT för UPDATE-instruktionen.

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

AG. Använda UPDATE-instruktionen med information från en annan tabell

Det här exemplet skapar en tabell för att lagra total försäljning per år. Den uppdaterar den totala försäljningen för år 2004 genom att köra en SELECT-instruktion mot tabellen FactInternetSales.

-- 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. ANSI-anslutning för uppdateringsuttryck

Det här exemplet visar hur du uppdaterar data baserat på resultatet från att ansluta till en annan tabell.

CREATE TABLE dbo.Table1   
    (ColA INT NOT NULL, ColB DECIMAL(10,3) NOT NULL);  
GO  
CREATE TABLE dbo.Table2   
    (ColA INT NOT NULL, ColB DECIMAL(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.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;
GO

Se även

CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
markörer (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
text- och bildfunktioner (Transact-SQL)
MED common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)
Sortering och Unicode-stöd
Single-Byte- och flerbytesteckenuppsättningar