UPDATE (Transact-SQL)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Warehouse i Microsoft Fabric
SQL-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
Point
genom 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 namnetSetXY
. 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 typPoint
.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_owner
och 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
, CommissionPct
och 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 Point
genom 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
på @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, @NewHours
och 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