UPDATE (Transact-SQL)
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Warehouse in Microsoft Fabric
SQL-database in Microsoft Fabric
Hiermee wijzigt u bestaande gegevens in een tabel of weergave in SQL Server. Zie Voorbeeldenvoor voorbeelden.
Transact-SQL syntaxisconventies
Syntaxis
-- 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 ) ]
[;]
Argumenten
MET <common_table_expression>
Hiermee geeft u de tijdelijke benoemde resultatenset of weergave, ook wel bekend als common table expression (CTE), gedefinieerd binnen het bereik van de UPDATE-instructie. De CTE-resultatenset is afgeleid van een eenvoudige query en verwijst naar de UPDATE-instructie.
Veelgebruikte tabelexpressies kunnen ook worden gebruikt met de instructies SELECT, INSERT, DELETE en CREATE VIEW. Zie WITH common_table_expression (Transact-SQL)voor meer informatie.
TOP (expressie) [ PERCENT ]
Hiermee geeft u het aantal of het percentage rijen op dat wordt bijgewerkt.
expressie kan een getal of een percentage van de rijen zijn.
De rijen waarnaar wordt verwezen in de TOP-expressie die wordt gebruikt met INSERT, UPDATE of DELETE, worden in geen enkele volgorde gerangschikt.
Scheidingstekens tussen haakjes expressie in TOP zijn vereist in de instructies INSERT, UPDATE en DELETE. Zie TOP (Transact-SQL)voor meer informatie.
table_alias
De alias die is opgegeven in de UPDATE-component die de tabel of weergave vertegenwoordigt waaruit de rijen moeten worden bijgewerkt.
server_name
Is de naam van de server (met behulp van een gekoppelde servernaam of de OPENDATASOURCE- functie als servernaam) waarop de tabel of weergave zich bevindt. Als server_name is opgegeven, zijn database_name en schema_name vereist.
database_name
Is de naam van de database.
schema_name
Is de naam van het schema waartoe de tabel of weergave behoort.
table_or_view_name
Is de naam van de tabel of weergave waaruit de rijen moeten worden bijgewerkt. De weergave waarnaar wordt verwezen door table_or_view_name moet kunnen worden bijgewerkt en moet exact één basistabel in de FROM-component van de weergave verwijzen. Zie CREATE VIEW (Transact-SQL)voor meer informatie over bijwerkbare weergaven.
rowset_function_limited
Is de OPENQUERY- of functie OPENROWSET, afhankelijk van providermogelijkheden.
WITH (<Table_Hint_Limited>)
Hiermee geeft u een of meer tabelhints op die zijn toegestaan voor een doeltabel. Het sleutelwoord WITH en de haakjes zijn vereist. NOLOCK, READUNCOMMITTED, NOEXPAND en verschillende andere zijn niet toegestaan. Zie Tabelhints (Transact-SQL)voor meer informatie over tabelhints.
@
table_variable
Hiermee geeft u een tabel variabele als tabelbron.
SET
Hiermee geeft u de lijst met kolom- of variabelenamen die moeten worden bijgewerkt.
column_name
Is een kolom die de gegevens bevat die moeten worden gewijzigd.
column_name moet aanwezig zijn in table_or view_name. Identiteitskolommen kunnen niet worden bijgewerkt.
expressie
Is een variabele, letterlijke waarde, expressie of een subselectie-instructie (tussen haakjes) die één waarde retourneert. De waarde die wordt geretourneerd door expressie vervangt de bestaande waarde in column_name of @variabele.
Notitie
Wanneer u verwijst naar de Gegevenstypen Unicode-tekens nchar, nvarcharen ntext, moet 'expressie' worden voorafgegaan door de hoofdletter 'N'. Als N niet is opgegeven, converteert SQL Server de tekenreeks naar de codepagina die overeenkomt met de standaardsortering van de database of kolom. Alle tekens die niet op deze codepagina zijn gevonden, gaan verloren.
VERSTEK
Hiermee geeft u op dat de standaardwaarde die voor de kolom is gedefinieerd, de bestaande waarde in de kolom vervangt. Dit kan ook worden gebruikt om de kolom te wijzigen in NULL als de kolom geen standaardwaarde heeft en is gedefinieerd om null-waarden toe te staan.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Operator voor samengestelde toewijzing:
+= Toevoegen en toewijzen
-= Aftrekken en toewijzen
*= Vermenigvuldigen en toewijzen
/= Delen en toewijzen
%= Modulo en toewijzen
&= Bitwise AND en toewijzen
^= Bitwise XOR en toewijzen
|= Bitsgewijze OR en toewijzen
udt_column_name
Is een door de gebruiker gedefinieerde kolom.
property_name | field_name
Is een openbare eigenschap of een openbaar gegevenslid van een door de gebruiker gedefinieerd type.
method_name(argument [ ,... n] )
Is een niet-statische openbare mutatormethode van udt_column_name die een of meer argumenten gebruikt.
.WRITE (expressie,@verschuiving,@Lengte)
Hiermee geeft u op dat een sectie van de waarde van column_name moet worden gewijzigd.
expressie vervangt @Lengte eenheden beginnend bij @Verschuiving van column_name. Alleen kolommen van varchar(max), nvarchar(max)of varbinary(max) kunnen worden opgegeven met deze component.
column_name kan niet NULL zijn en kan niet worden gekwalificeerd met een tabelnaam of tabelalias.
expressie is de waarde die naar column_namewordt gekopieerd. expressie moet impliciet worden geëvalueerd of impliciet kunnen worden omgezet in het column_name type. Als expressie is ingesteld op NULL, wordt @Lengte genegeerd en wordt de waarde in column_name afgekapt op het opgegeven @Verschuiving.
@ verschuiving is het beginpunt in de waarde die is opgeslagen in column_name waarop expressie is geschreven. @ verschuiving een ordinale bytepositie op basis van nul is, is biginten kan geen negatief getal zijn. Als @verschuiving NULL is, wordt de updatebewerking toegevoegd expressie aan het einde van de bestaande column_name waarde en @Lengte wordt genegeerd. Als @verschuiving groter is dan de bytelengte van de column_name waarde, retourneert de database-engine een fout. Als @verschuiving plus @Lengte het einde van de onderliggende waarde in de kolom overschrijdt, wordt de verwijdering tot het laatste teken van de waarde uitgevoerd.
@ Lengte is de lengte van de sectie in de kolom, te beginnen bij @verschuiving, die wordt vervangen door expressie. @ Lengte is bigint en kan geen negatief getal zijn. Als @Lengte NULL is, verwijdert de updatebewerking alle gegevens van @Verschuiving aan het einde van de column_name waarde.
Zie Gegevenstypen voor grote waarden bijwerkenvoor meer informatie.
@
variabele
Is een gedeclareerde variabele die is ingesteld op de waarde die wordt geretourneerd door expressie.
STEL @variabele = kolom = expressie in stelt de variabele in op dezelfde waarde als de kolom. Dit verschilt van SET @variabele = kolom, kolom = expressie, waarmee de variabele wordt ingesteld op de waarde vóór bijwerken van de kolom.
<OUTPUT_Clause>
Retourneert bijgewerkte gegevens of expressies die erop zijn gebaseerd als onderdeel van de UPDATE-bewerking. De OUTPUT-component wordt niet ondersteund in DML-instructies die zijn gericht op externe tabellen of weergaven. Zie OUTPUT-component (Transact-SQL)voor meer informatie over de argumenten en het gedrag van deze component.
FROM <table_source>
Hiermee geeft u op dat een tabel, weergave of afgeleide tabelbron wordt gebruikt om de criteria voor de updatebewerking op te geven. Zie FROM (Transact-SQL)voor meer informatie.
Als het object dat wordt bijgewerkt hetzelfde is als het object in de FROM-component en er slechts één verwijzing is naar het object in de FROM-component, kan een objectalias al dan niet worden opgegeven. Als het object dat wordt bijgewerkt meer dan één keer wordt weergegeven in de FROM-component, één en slechts één, mag verwijzing naar het object geen tabelalias opgeven. Alle andere verwijzingen naar het object in de FROM-component moeten een objectalias bevatten.
Een weergave met een IN PLAATS VAN UPDATE-trigger kan geen doel zijn van een UPDATE met een FROM-component.
Notitie
Elke aanroep naar OPENDATASOURCE, OPENQUERY of OPENROWSET in de FROM-component wordt afzonderlijk en onafhankelijk geëvalueerd van elke aanroep naar deze functies die worden gebruikt als doel van de update, zelfs als identieke argumenten worden verstrekt aan de twee aanroepen. Met name filter- of joinvoorwaarden die worden toegepast op het resultaat van een van deze aanroepen, hebben geen invloed op de resultaten van de andere.
WAAR
Hiermee geeft u de voorwaarden op die de rijen beperken die worden bijgewerkt. Er zijn twee vormen van bijwerken op basis van welke vorm van de WHERE-component wordt gebruikt:
Doorzochte updates geven een zoekvoorwaarde op om de rijen te kwalificeren die moeten worden verwijderd.
Positioned updates gebruiken de CURRENT OF-component om een cursor op te geven. De updatebewerking vindt plaats op de huidige positie van de cursor.
<search_condition>
Hiermee geeft u de voorwaarde op waaraan moet worden voldaan voor de rijen die moeten worden bijgewerkt. De zoekvoorwaarde kan ook de voorwaarde zijn waarop een join is gebaseerd. Er is geen limiet voor het aantal predicaten dat kan worden opgenomen in een zoekvoorwaarde. Zie Zoekvoorwaarde (Transact-SQL)voor meer informatie over predicaten en zoekvoorwaarden.
HUIDIGE VAN
Hiermee geeft u op dat de update wordt uitgevoerd op de huidige positie van de opgegeven cursor.
Een positioned update met behulp van een WHERE CURRENT OF-component werkt de enkele rij op de huidige positie van de cursor bij. Dit kan nauwkeuriger zijn dan een doorzochte update die gebruikmaakt van een WHERE-<search_condition>-component om de rijen te kwalificeren die moeten worden bijgewerkt. Met een doorzochte update worden meerdere rijen gewijzigd wanneer de zoekvoorwaarde niet uniek één rij identificeert.
GLOBAAL
Hiermee geeft u op dat cursor_name verwijst naar een globale cursor.
cursor_name
Is de naam van de geopende cursor waaruit het ophalen moet worden gemaakt. Als zowel een globale als een lokale cursor met de naam cursor_name bestaat, verwijst dit argument naar de globale cursor als GLOBAL is opgegeven; anders verwijst deze naar de lokale cursor. De cursor moet updates toestaan.
cursor_variable_name
Is de naam van een cursorvariabele.
cursor_variable_name moet verwijzen naar een cursor die updates toestaat.
OPTION (<query_hint> [ ,... n ] )
Hiermee geeft u op dat optimizer-hints worden gebruikt om de manier aan te passen waarop de database-engine de instructie verwerkt. Zie queryhints (Transact-SQL)voor meer informatie.
Aanbevolen procedures
Gebruik de functie @@ROWCOUNT
om het aantal ingevoegde rijen te retourneren aan de clienttoepassing. Zie @@ROWCOUNT (Transact-SQL)voor meer informatie.
Namen van variabelen kunnen worden gebruikt in UPDATE-instructies om de oude en nieuwe waarden weer te geven die worden beïnvloed, maar dit moet alleen worden gebruikt wanneer de UPDATE-instructie van invloed is op één record. Als de UPDATE-instructie van invloed is op meerdere records, gebruikt u de OUTPUT-componentom de oude en nieuwe waarden voor elke record te retourneren.
Wees voorzichtig bij het opgeven van de FROM-component om de criteria voor de updatebewerking op te geven. De resultaten van een UPDATE-instructie zijn niet gedefinieerd als de instructie een FROM-component bevat die niet zodanig is opgegeven dat er slechts één waarde beschikbaar is voor elke kolom die wordt bijgewerkt, dat wil zeggen als de UPDATE-instructie niet deterministisch is. In de INSTRUCTIE UPDATE in het volgende script voldoen beide rijen in Table1
bijvoorbeeld aan de kwalificaties van de FROM-component in de UPDATE-instructie; maar het is niet gedefinieerd welke rij van Table1
wordt gebruikt om de rij in Table2.
bij te werken
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;
Hetzelfde probleem kan zich voordoen wanneer de FROM
- en WHERE CURRENT OF
-componenten worden gecombineerd. In het volgende voorbeeld voldoen beide rijen in Table2
aan de kwalificaties van de FROM
component in de UPDATE
-instructie. Het is niet gedefinieerd welke rij van Table2
moet worden gebruikt om de rij in Table1
bij te werken.
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
Compatibiliteitsondersteuning
Ondersteuning voor het gebruik van de READUNCOMMITTED- en NOLOCK-hints in de FROM-component die van toepassing zijn op de doeltabel van een UPDATE- of DELETE-instructie, wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze hints in deze context in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die deze momenteel gebruiken.
Gegevenstypen
Alle tekentekens en nchar kolommen zijn rechts opgevuld met de gedefinieerde lengte.
Als ANSI_PADDING is ingesteld op UIT, worden alle volgspaties verwijderd uit gegevens die zijn ingevoegd in varchar en nvarchar kolommen, behalve in tekenreeksen die alleen spaties bevatten. Deze tekenreeksen worden afgekapt tot een lege tekenreeks. Als ANSI_PADDING is ingesteld op AAN, worden volgspaties ingevoegd. Het ODBC-stuurprogramma van Microsoft SQL Server en de OLE DB-provider voor SQL Server instellen automatisch ANSI_PADDING ON voor elke verbinding. Dit kan worden geconfigureerd in ODBC-gegevensbronnen of door verbindingskenmerken of eigenschappen in te stellen. Zie set ANSI_PADDING (Transact-SQL)voor meer informatie.
Tekst-, ntekst- en afbeeldingskolommen bijwerken
Als u een tekstwijzigt, ntextof afbeelding kolom met UPDATE initialiseert, wordt de kolom geïnitialiseerd, wordt er een geldige tekstwijzer aan toegewezen en wordt ten minste één gegevenspagina toegewezen, tenzij de kolom wordt bijgewerkt met NULL.
Als u grote blokken tekst , ntextof afbeelding gegevens wilt vervangen of wijzigen, gebruikt u WRITETEXT- of UPDATETEXT- in plaats van de UPDATE-instructie.
Als de INSTRUCTIE UPDATE meer dan één rij kan wijzigen tijdens het bijwerken van zowel de clustersleutel als een of meer tekst, ntextof afbeelding kolommen, wordt de gedeeltelijke update van deze kolommen uitgevoerd als een volledige vervanging van de waarden.
Belangrijk
De ntext, teksten afbeelding gegevenstypen worden verwijderd in een toekomstige versie van Microsoft SQL Server. Vermijd het gebruik van deze gegevenstypen in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die deze momenteel gebruiken. Gebruik nvarchar(max), varchar(max)en varbinary(max).
Gegevenstypen voor grote waarden bijwerken
Gebruik de .WRITE (expressie,@Verschuiving,@Lengte) component voor het uitvoeren van een gedeeltelijke of volledige update van varchar(max), nvarchar(max)en varbinary(max) gegevenstypen.
Een gedeeltelijke update van een varchar(max) kolom kan bijvoorbeeld alleen de eerste 200 bytes van de kolom (200 tekens als u ASCII-tekens gebruikt) verwijderen of wijzigen, terwijl bij een volledige update alle gegevens in de kolom worden verwijderd of gewijzigd. . WRITE updates waarmee nieuwe gegevens worden ingevoegd of toegevoegd, worden minimaal vastgelegd als het databaseherstelmodel is ingesteld op bulksgewijs geregistreerd of eenvoudig. Minimale logboekregistratie wordt niet gebruikt wanneer bestaande waarden worden bijgewerkt. Zie Het transactielogboek (SQL Server)voor meer informatie.
De database-engine converteert een gedeeltelijke update naar een volledige update wanneer de UPDATE-instructie een van deze acties veroorzaakt:
- Hiermee wijzigt u een sleutelkolom van de gepartitioneerde weergave of tabel.
- Wijzigt meer dan één rij en werkt ook de sleutel van een niet-geclusterde index bij naar een niet-stante waarde.
U kunt de niet gebruiken. WRITE component voor het bijwerken van een NULL-kolom of stel de waarde van column_name in op NULL.
@ verschuiving en @Lengte worden opgegeven in bytes voor varbinaire en varchar gegevenstypen en in byteparen voor het nvarchar gegevenstype. Zie teken en varchar (Transact-SQL) en nchar en nvarchar (Transact-SQL)voor meer informatie over lengten van tekenreeksgegevenstypen.
Voor de beste prestaties raden we aan dat gegevens worden ingevoegd of bijgewerkt in segmentgrootten die veelvouden van 8040 bytes zijn.
Als de kolom is gewijzigd door de . Write component wordt verwezen in een OUTPUT-component, de volledige waarde van de kolom, ofwel de voorafbeelding in verwijderd.column_name of de naafbeelding in ingevoegd.column_namewordt geretourneerd naar de opgegeven kolom in de tabelvariabele. Zie voorbeeld R die volgt.
Om dezelfde functionaliteit van te bereiken. SCHRIJF met andere teken- of binaire gegevenstypen en gebruik de STUFF -(Transact-SQL).
Door de gebruiker gedefinieerde typekolommen bijwerken
Het bijwerken van waarden in door de gebruiker gedefinieerde typekolommen kan op een van de volgende manieren worden uitgevoerd:
Een waarde opgeven in een sql Server-systeemgegevenstype, zolang het door de gebruiker gedefinieerde type impliciete of expliciete conversie van dat type ondersteunt. In het volgende voorbeeld ziet u hoe u een waarde in een kolom met door de gebruiker gedefinieerde type
Point
bijwerkt door expliciet te converteren vanuit een tekenreeks.UPDATE Cities SET Location = CONVERT(Point, '12.3:46.2') WHERE Name = 'Anchorage';
Het aanroepen van een methode, gemarkeerd als een mutator, van het door de gebruiker gedefinieerde type, om de update uit te voeren. In het volgende voorbeeld wordt een mutatormethode van het type
Point
met de naamSetXY
aangeroepen. Hiermee wordt de status van het exemplaar van het type bijgewerkt.UPDATE Cities SET Location.SetXY(23.5, 23.5) WHERE Name = 'Anchorage';
Notitie
SQL Server retourneert een fout als een mutatormethode wordt aangeroepen op een Transact-SQL null-waarde of als een nieuwe waarde die wordt geproduceerd door een mutatormethode null is.
De waarde van een geregistreerde eigenschap of een openbaar gegevenslid van het door de gebruiker gedefinieerde type wijzigen. De expressie die de waarde levert, moet impliciet worden omgezet in het type eigenschap. In het volgende voorbeeld wordt de waarde van de eigenschap gewijzigd
X
van door de gebruiker gedefinieerdePoint
.UPDATE Cities SET Location.X = 23.5 WHERE Name = 'Anchorage';
Als u verschillende eigenschappen van dezelfde door de gebruiker gedefinieerde kolom wilt wijzigen, geeft u meerdere UPDATE-instructies uit of roept u een mutatormethode van het type aan.
FILESTREAM-gegevens bijwerken
U kunt de INSTRUCTIE UPDATE gebruiken om een FILESTREAM-veld bij te werken naar een null-waarde, lege waarde of een relatief kleine hoeveelheid inlinegegevens. Een grote hoeveelheid gegevens wordt echter efficiënter gestreamd naar een bestand met behulp van Win32-interfaces. Wanneer u een FILESTREAM-veld bijwerkt, wijzigt u de onderliggende BLOB-gegevens in het bestandssysteem. Wanneer een FILESTREAM-veld is ingesteld op NULL, worden de BLOB-gegevens die aan het veld zijn gekoppeld, verwijderd. U kunt het niet gebruiken. WRITE(), om gedeeltelijke updates uit te voeren voor FILESTREAM-gegevens. Zie FILESTREAM (SQL Server)voor meer informatie.
Foutafhandeling
Als een update van een rij een beperking of regel schendt, de NULL-instelling voor de kolom schendt of de nieuwe waarde een niet-compatibel gegevenstype is, wordt de instructie geannuleerd, wordt er een fout geretourneerd en worden er geen records bijgewerkt.
Wanneer een UPDATE-instructie een rekenkundige fout tegenkomt (overloop, delen door nul of een domeinfout) tijdens de evaluatie van de expressie, wordt de update niet uitgevoerd. De rest van de batch wordt niet uitgevoerd en er wordt een foutbericht geretourneerd.
Als een update van een kolom of kolommen die deelnemen aan een geclusterde index de grootte van de geclusterde index veroorzaakt en de rij meer dan 8.060 bytes bevat, mislukt de update en wordt er een foutbericht geretourneerd.
Interoperabiliteit
UPDATE-instructies zijn alleen toegestaan in de hoofdtekst van door de gebruiker gedefinieerde functies als de tabel die wordt gewijzigd een tabelvariabele is.
Wanneer een INSTEAD OF
-trigger is gedefinieerd voor UPDATE-acties voor een tabel, wordt de trigger uitgevoerd in plaats van de UPDATE-instructie. Eerdere versies van SQL Server ondersteunen alleen AFTER-triggers die zijn gedefinieerd in UPDATE en andere instructies voor gegevenswijziging. De FROM-component kan niet worden opgegeven in een UPDATE-instructie die rechtstreeks of indirect verwijst naar een weergave met een INSTEAD OF
trigger die erop is gedefinieerd. Zie CREATE TRIGGER (Transact-SQL)voor meer informatie over IN PLAATS VAN triggers.
Momenteel kan de FROM-component niet worden opgegeven in een UPDATE-instructie in Warehouse in Microsoft Fabric. Update-instructies met één tabel worden ondersteund.
Beperkingen en beperkingen
De FROM-component kan niet worden opgegeven in een UPDATE-instructie die rechtstreeks of indirect verwijst naar een weergave met een INSTEAD OF
trigger die erop is gedefinieerd. Zie CREATE TRIGGER (Transact-SQL)voor meer informatie over INSTEAD OF
triggers.
Wanneer een algemene tabelexpressie (CTE) het doel is van een UPDATE-instructie, moeten alle verwijzingen naar de CTE in de instructie overeenkomen. Als bijvoorbeeld aan de CTE een alias in de FROM-component is toegewezen, moet de alias worden gebruikt voor alle andere verwijzingen naar de CTE. Ondubbelzinnige CTE-verwijzingen zijn vereist omdat een CTE geen object-id heeft, die SQL Server gebruikt om de impliciete relatie tussen een object en de alias te herkennen. Zonder deze relatie kan het queryplan onverwacht joingedrag en onbedoelde queryresultaten opleveren. In de volgende voorbeelden ziet u de juiste en onjuiste methoden voor het opgeven van een CTE wanneer de CTE het doelobject van de updatebewerking is.
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
Dit is de resultatenset.
ID Value
------ -----
1 100
2 200
(2 row(s) affected)
UPDATE-instructie met CTE-verwijzingen die onjuist overeenkomen.
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
Dit is de resultatenset.
ID Value
------ -----
1 100
2 100
(2 row(s) affected)
Vergrendelingsgedrag
Een UPDATE-instructie verkrijgt een exclusieve (X
) vergrendeling op alle rijen die worden gewijzigd en bewaart deze vergrendelingen totdat de transactie is voltooid. Afhankelijk van het queryplan voor de UPDATE-instructie, het aantal rijen dat wordt gewijzigd en het isolatieniveau van de transactie, kunnen vergrendelingen worden verkregen op pagina- of tabelniveau in plaats van op rijniveau. Als u deze vergrendelingen op een hoger niveau wilt voorkomen, kunt u update-instructies delen die duizenden rijen of meer in batches beïnvloeden en ervoor zorgen dat join- en filtervoorwaarden worden ondersteund door indexen. Zie het artikel over vergrendelen in de database-engine voor meer informatie over vergrendelingsmechanica in SQL Server.
Als geoptimaliseerde vergrendeling is ingeschakeld, zijn er enkele aspecten van het vergrendelingsgedrag voor UPDATE
wijziging. Exclusieve (X
) vergrendelingen worden bijvoorbeeld pas bewaard als de transactie is voltooid. Zie Geoptimaliseerde vergrendelingvoor meer informatie.
Gedrag van logboekregistratie
De UPDATE-instructie wordt geregistreerd; gedeeltelijke updates voor gegevenstypen met een grote waarde met behulp van de . De component WRITE wordt minimaal vastgelegd. Zie 'Gegevenstypen voor grote waarden bijwerken' in de eerdere sectie 'Gegevenstypen' voor meer informatie.
Veiligheid
Machtigingen
UPDATE
machtigingen zijn vereist voor de doeltabel.
SELECT
machtigingen zijn ook vereist voor de tabel die wordt bijgewerkt als de UPDATE-instructie een WHERE-component bevat of als expressie in de SET-component een kolom in de tabel gebruikt.
UPDATE-machtigingen zijn standaard ingesteld op leden van de sysadmin
vaste serverfunctie, de db_owner
en db_datawriter
vaste databaserollen en de eigenaar van de tabel. Leden van de rollen sysadmin
, db_owner
en db_securityadmin
en de eigenaar van de tabel kan machtigingen overdragen aan andere gebruikers.
Voorbeelden
Categorie | Aanbevolen syntaxiselementen |
---|---|
basissyntaxis | UPDATE |
de rijen beperken die zijn bijgewerkt | WHERE * TOP * WITH common table expression * WHERE CURRENT OF |
Kolomwaarden instellen | berekende waarden * samengestelde operators * standaardwaarden * subquery's |
doelobjecten opgeven die niet de standaardtabellen | weergaven * tabelvariabelen * tabelaliassen |
gegevens bijwerken op basis van gegevens uit andere tabellen | VAN |
rijen bijwerken in een externe tabel | gekoppelde server * OPENQUERY * OPENDATASOURCE |
grote objectgegevenstypen bijwerken | . SCHRIJVEN * OPENROWSET |
door de gebruiker gedefinieerde typen bijwerken | door de gebruiker gedefinieerde typen |
het standaardgedrag van de queryoptimalisatie overschrijven met hints | tabelhints * queryhints |
de resultaten van de UPDATE-instructie vastleggen | OUTPUT-component |
UPDATE gebruiken in andere instructies | Opgeslagen procedures * TRY... VANGEN |
Basissyntaxis
Voorbeelden in deze sectie laten de basisfunctionaliteit van de UPDATE-instructie zien met behulp van de minimaal vereiste syntaxis.
Een. Een eenvoudige UPDATE-instructie gebruiken
In het volgende voorbeeld wordt één kolom bijgewerkt voor alle rijen in de Person.Address
tabel.
USE AdventureWorks2022;
GO
UPDATE Person.Address
SET ModifiedDate = GETDATE();
B. Meerdere kolommen bijwerken
In het volgende voorbeeld worden de waarden in de Bonus
, CommissionPct
en SalesQuota
kolommen voor alle rijen in de SalesPerson
tabel bijgewerkt.
USE AdventureWorks2022;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO
De rijen beperken die worden bijgewerkt
Voorbeelden in deze sectie laten zien hoe u kunt gebruiken om het aantal rijen te beperken dat wordt beïnvloed door de UPDATE-instructie.
C. De WHERE-component gebruiken
In het volgende voorbeeld wordt de WHERE-component gebruikt om op te geven welke rijen moeten worden bijgewerkt. De instructie werkt de waarde in de kolom Color
van de Production.Product
tabel bij voor alle rijen met een bestaande waarde 'Rood' in de kolom Color
en een waarde in de kolom Name
die begint met 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. De TOP-component gebruiken
In de volgende voorbeelden wordt de TOP-component gebruikt om het aantal rijen te beperken dat is gewijzigd in een UPDATE-instructie. Wanneer een component TOP (n) wordt gebruikt met UPDATE, wordt de updatebewerking uitgevoerd op een willekeurige selectie van 'n' aantal rijen. In het volgende voorbeeld wordt de kolom VacationHours
met 25 procent bijgewerkt voor 10 willekeurige rijen in de Employee
tabel.
USE AdventureWorks2022;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO
Als u TOP moet gebruiken om updates toe te passen in een zinvolle chronologische volgorde, moet u TOP samen met ORDER BY gebruiken in een subselectie-instructie. In het volgende voorbeeld worden de vakantieuren van de 10 werknemers bijgewerkt met de vroegste huurdatums.
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. De component WITH common_table_expression gebruiken
In het volgende voorbeeld wordt de PerAssemblyQty
waarde bijgewerkt voor alle onderdelen en onderdelen die direct of indirect worden gebruikt om de ProductAssemblyID 800
te maken. De algemene tabelexpressie retourneert een hiërarchische lijst met onderdelen die rechtstreeks worden gebruikt om ProductAssemblyID 800
en onderdelen te bouwen die worden gebruikt om deze onderdelen te bouwen, enzovoort. Alleen de rijen die door de algemene tabelexpressie worden geretourneerd, worden gewijzigd.
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. De WHERE CURRENT OF-component gebruiken
In het volgende voorbeeld wordt de COMPONENT WHERE CURRENT OF gebruikt om alleen de rij waarop de cursor is positioneerd, bij te werken. Wanneer een cursor is gebaseerd op een join, wordt alleen de table_name
gewijzigd die is opgegeven in de UPDATE-instructie. Andere tabellen die deelnemen aan de cursor, worden niet beïnvloed.
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
Kolomwaarden instellen
Voorbeelden in deze sectie laten zien hoe u kolommen bijwerkt met behulp van berekende waarden, subquery's en STANDAARDwaarden.
G. Een berekende waarde opgeven
In de volgende voorbeelden worden berekende waarden gebruikt in een UPDATE-instructie. In het voorbeeld wordt de waarde in de kolom ListPrice
verdubbeld voor alle rijen in de Product
tabel.
USE AdventureWorks2022;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO
H. Een samengestelde operator opgeven
In het volgende voorbeeld wordt de variabele @NewPrice
gebruikt om de prijs van alle rode fietsen te verhogen door de huidige prijs te nemen en er 10 aan toe te voegen.
USE AdventureWorks2022;
GO
DECLARE @NewPrice INT = 10;
UPDATE Production.Product
SET ListPrice += @NewPrice
WHERE Color = N'Red';
GO
In het volgende voorbeeld wordt de samengestelde operator += gebruikt om de gegevens ' - tool malfunction'
toe te voegen aan de bestaande waarde in de kolom Name
voor rijen met een ScrapReasonID
tussen 10 en 12.
USE AdventureWorks2022;
GO
UPDATE Production.ScrapReason
SET Name += ' - tool malfunction'
WHERE ScrapReasonID BETWEEN 10 and 12;
Ik. Een subquery opgeven in de SET-component
In het volgende voorbeeld wordt een subquery in de SET-component gebruikt om de waarde te bepalen die wordt gebruikt om de kolom bij te werken. De subquery moet slechts een scalaire waarde retourneren (dat wil gezegd één waarde per rij). In het voorbeeld wordt de kolom SalesYTD
in de SalesPerson
tabel aangepast aan de meest recente verkopen die zijn vastgelegd in de SalesOrderHeader
tabel. De subquery aggregert de verkoop voor elke verkoper in de UPDATE
-instructie.
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. Rijen bijwerken met standaardwaarden
In het volgende voorbeeld wordt de kolom CostRate
ingesteld op de standaardwaarde (0,00) voor alle rijen met een CostRate
waarde die groter is dan 20.00
.
USE AdventureWorks2022;
GO
UPDATE Production.Location
SET CostRate = DEFAULT
WHERE CostRate > 20.00;
Doelobjecten opgeven die niet standaardtabellen zijn
Voorbeelden in deze sectie laten zien hoe u rijen bijwerkt door een weergave, tabelalias of tabelvariabele op te geven.
K. Een weergave opgeven als doelobject
In het volgende voorbeeld worden rijen in een tabel bijgewerkt door een weergave op te geven als doelobject. De weergavedefinitie verwijst echter naar meerdere tabellen, maar de UPDATE-instructie slaagt omdat deze verwijst naar kolommen uit slechts één van de onderliggende tabellen. De UPDATE-instructie mislukt als kolommen uit beide tabellen zijn opgegeven. Zie Gegevens wijzigen via een weergave-voor meer informatie.
USE AdventureWorks2022;
GO
UPDATE Person.vStateProvinceCountryRegion
SET CountryRegionName = 'United States of America'
WHERE CountryRegionName = 'United States';
L. Een tabelalias opgeven als doelobject
In het volgende voorbeeld worden rijen in de tabel bijgewerkt Production.ScrapReason
. De tabelalias die is toegewezen aan ScrapReason
in de FROM-component wordt opgegeven als het doelobject in de UPDATE-component.
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. Een tabelvariabele opgeven als doelobject
In het volgende voorbeeld worden rijen in een tabelvariabele bijgewerkt.
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
Gegevens bijwerken op basis van gegevens uit andere tabellen
Voorbeelden in deze sectie laten methoden zien voor het bijwerken van rijen uit de ene tabel op basis van informatie in een andere tabel.
N. De UPDATE-instructie gebruiken met informatie uit een andere tabel
In het volgende voorbeeld wordt de kolom SalesYTD
in de tabel SalesPerson
aangepast aan de meest recente verkopen die zijn vastgelegd in de SalesOrderHeader
tabel.
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
In het vorige voorbeeld wordt ervan uitgegaan dat slechts één verkoop wordt geregistreerd voor een opgegeven verkoper op een specifieke datum en dat updates actueel zijn. Als meer dan één verkoop voor een opgegeven verkoper op dezelfde dag kan worden geregistreerd, werkt het weergegeven voorbeeld niet correct. Het voorbeeld wordt zonder fouten uitgevoerd, maar elke SalesYTD
waarde wordt bijgewerkt met slechts één verkoop, ongeacht het aantal verkopen dat op die dag daadwerkelijk is opgetreden. Dit komt doordat één UPDATE-instructie nooit twee keer dezelfde rij bijwerkt.
In de situatie waarin meer dan één verkoop voor een opgegeven verkoper op dezelfde dag kan plaatsvinden, moeten alle verkopen voor elke verkoper worden samengevoegd binnen de UPDATE
-instructie, zoals wordt weergegeven in het volgende voorbeeld:
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
Rijen in een externe tabel bijwerken
Voorbeelden in deze sectie laten zien hoe u rijen in een externe doeltabel bijwerkt met behulp van een gekoppelde server of een rijsetfunctie om te verwijzen naar de externe tabel.
O. Gegevens in een externe tabel bijwerken met behulp van een gekoppelde server
In het volgende voorbeeld wordt een tabel bijgewerkt op een externe server. Het voorbeeld begint met het maken van een koppeling naar de externe gegevensbron met behulp van sp_addlinkedserver. De naam van de gekoppelde server, MyLinkedServer
, wordt vervolgens opgegeven als onderdeel van de naam van het vierdelige object in het formulierserver.catalog.schema.object. Houd er rekening mee dat u een geldige servernaam voor @datasrc
moet opgeven.
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. Gegevens in een externe tabel bijwerken met behulp van de functie OPENQUERY
In het volgende voorbeeld wordt een rij in een externe tabel bijgewerkt door de functie OPENQUERY- rijset op te geven. De naam van de gekoppelde server die in het vorige voorbeeld is gemaakt, wordt in dit voorbeeld gebruikt.
UPDATE OPENQUERY (MyLinkedServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')
SET GroupName = 'Sales and Marketing';
Q. Gegevens in een externe tabel bijwerken met behulp van de functie OPENDATASOURCE
In het volgende voorbeeld wordt een rij in een externe tabel bijgewerkt door de functie OPENDATASOURCE rijset op te geven. Geef een geldige servernaam op voor de gegevensbron met behulp van de indeling server_name of server_name\instance_name. Mogelijk moet u het exemplaar van SQL Server configureren voor ad-hoc gedistribueerde query's. Zie ad-hoc gedistribueerde query's serverconfiguratieoptievoor meer informatie.
UPDATE OPENDATASOURCE('SQLNCLI', 'Data Source=<server name>;Integrated Security=SSPI').AdventureWorks2022.HumanResources.Department
SET GroupName = 'Sales and Marketing' WHERE DepartmentID = 4;
Gegevenstypen groot object bijwerken
Voorbeelden in deze sectie laten methoden zien voor het bijwerken van waarden in kolommen die zijn gedefinieerd met grote objectgegevenstypen (LOB).
R. Update gebruiken met . SCHRIJVEN om gegevens in een kolom nvarchar(max) te wijzigen
In het volgende voorbeeld wordt de . WRITE-component voor het bijwerken van een gedeeltelijke waarde in DocumentSummary
, een nvarchar(max) kolom in de Production.Document
tabel. Het woord components
wordt vervangen door het woord features
door het vervangende woord op te geven, de beginlocatie (verschuiving) van het woord dat moet worden vervangen in de bestaande gegevens en het aantal tekens dat moet worden vervangen (lengte). In het voorbeeld wordt ook de OUTPUT-component gebruikt om de voor- en naafbeeldingen van de kolom DocumentSummary
te retourneren aan de @MyTableVar
tabelvariabele.
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. Update gebruiken met . SCHRIJVEN om gegevens toe te voegen en te verwijderen in een kolom nvarchar(max)
In de volgende voorbeelden worden gegevens toegevoegd aan en verwijderd uit een nvarchar(max) kolom met een waarde die momenteel is ingesteld op NULL. Omdat de . Write-component kan niet worden gebruikt om een NULL-kolom te wijzigen. De kolom wordt eerst gevuld met tijdelijke gegevens. Deze gegevens worden vervolgens vervangen door de juiste gegevens met behulp van de . WRITE-component. De aanvullende voorbeelden voegen gegevens toe aan het einde van de kolomwaarde, verwijderen (afkappen) gegevens uit de kolom en ten slotte gedeeltelijke gegevens uit de kolom verwijderen. In de SELECT-instructies worden de gegevenswijziging weergegeven die door elke UPDATE-instructie wordt gegenereerd.
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. UPDATE gebruiken met OPENROWSET om een varbinary(max)-kolom te wijzigen
In het volgende voorbeeld wordt een bestaande afbeelding vervangen die is opgeslagen in een varbinary(max) kolom door een nieuwe afbeelding. De functie OPENROWSET wordt gebruikt met de optie BULK om de afbeelding in de kolom te laden. In dit voorbeeld wordt ervan uitgegaan dat een bestand met de naam Tires.jpg
bestaat in het opgegeven bestandspad.
USE AdventureWorks2022;
GO
UPDATE Production.ProductPhoto
SET ThumbNailPhoto = (
SELECT *
FROM OPENROWSET(BULK 'c:Tires.jpg', SINGLE_BLOB) AS x )
WHERE ProductPhotoID = 1;
GO
U. UPDATE gebruiken om FILESTREAM-gegevens te wijzigen
In het volgende voorbeeld wordt de UPDATE-instructie gebruikt om de gegevens in het bestandssysteembestand te wijzigen. We raden deze methode niet aan voor het streamen van grote hoeveelheden gegevens naar een bestand. Gebruik de juiste Win32-interfaces. In het volgende voorbeeld wordt elke tekst in de bestandsrecord vervangen door de tekst Xray 1
. Zie FILESTREAM (SQL Server)voor meer informatie.
UPDATE Archive.dbo.Records
SET [Chart] = CAST('Xray 1' as VARBINARY(max))
WHERE [SerialNumber] = 2;
Door de gebruiker gedefinieerde typen bijwerken
In de volgende voorbeelden worden waarden gewijzigd in door de gebruiker gedefinieerde UDT-kolommen (CLR). Er worden drie methoden gedemonstreerd. Zie CLR User-Defined Typenvoor meer informatie over door de gebruiker gedefinieerde kolommen.
V. Een systeemgegevenstype gebruiken
U kunt een UDT bijwerken door een waarde op te leveren in een sql Server-systeemgegevenstype, zolang het door de gebruiker gedefinieerde type impliciete of expliciete conversie van dat type ondersteunt. In het volgende voorbeeld ziet u hoe u een waarde in een kolom met door de gebruiker gedefinieerde type Point
bijwerkt door expliciet te converteren vanuit een tekenreeks.
UPDATE dbo.Cities
SET Location = CONVERT(Point, '12.3:46.2')
WHERE Name = 'Anchorage';
W. Een methode aanroepen
U kunt een UDT bijwerken door een methode aan te roepen die is gemarkeerd als een mutator, van het door de gebruiker gedefinieerde type, om de update uit te voeren. In het volgende voorbeeld wordt een mutatormethode van het type Point
met de naam SetXY
aangeroepen. Hiermee wordt de status van het exemplaar van het type bijgewerkt.
UPDATE dbo.Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';
X. De waarde van een eigenschap of gegevenslid wijzigen
U kunt een UDT bijwerken door de waarde van een geregistreerde eigenschap of een openbaar gegevenslid van het door de gebruiker gedefinieerde type te wijzigen. De expressie die de waarde levert, moet impliciet worden omgezet in het type eigenschap. In het volgende voorbeeld wordt de waarde van de eigenschap gewijzigd X
van door de gebruiker gedefinieerde Point
.
UPDATE dbo.Cities
SET Location.X = 23.5
WHERE Name = 'Anchorage';
Het standaardgedrag van de queryoptimalisatie overschrijven met behulp van hints
Voorbeelden in deze sectie laten zien hoe u tabel- en queryhints gebruikt om tijdelijk het standaardgedrag van de queryoptimalisatie te overschrijven bij het verwerken van de UPDATE-instructie.
Voorzichtigheid
Omdat de SQL Server-queryoptimalisatie doorgaans het beste uitvoeringsplan voor een query selecteert, raden we u aan om hints alleen te gebruiken als laatste redmiddel door ervaren ontwikkelaars en databasebeheerders.
Y. Een tabelhint opgeven
In het volgende voorbeeld wordt de tabelhint TABLOCK opgegeven. Deze hint geeft aan dat een gedeelde vergrendeling wordt genomen op de tabel Production.Product
en wordt bewaard tot het einde van de UPDATE-instructie.
USE AdventureWorks2022;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
Z. Een queryhint opgeven
In het volgende voorbeeld wordt de queryhint opgegevenOPTIMIZE FOR (@variable)
in de UPDATE-instructie. Met deze hint wordt de queryoptimalisatie geïnstrueerd om een bepaalde waarde te gebruiken voor een lokale variabele wanneer de query wordt gecompileerd en geoptimaliseerd. De waarde wordt alleen gebruikt tijdens het optimaliseren van query's en niet tijdens het uitvoeren van query's.
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-%';
De resultaten van de UPDATE-instructie vastleggen
Voorbeelden in deze sectie laten zien hoe u de OUTPUT-component gebruikt om informatie te retourneren van, of expressies op basis van, elke rij die wordt beïnvloed door een UPDATE-instructie. Deze resultaten kunnen worden geretourneerd naar de verwerkingstoepassing voor gebruik in bijvoorbeeld bevestigingsberichten, archivering en andere toepassingsvereisten.
AA. UPDATE gebruiken met de OUTPUT-component
In het volgende voorbeeld wordt de kolom VacationHours
in de tabel Employee
met 25 procent bijgewerkt voor Werknemers met minder dan 10 VacationHours en wordt ook de waarde in de kolom ModifiedDate
ingesteld op de huidige datum. De OUTPUT
-component retourneert de waarde van VacationHours
die bestaat voordat u de UPDATE
-instructie toepast in de kolom deleted.VacationHours
en de bijgewerkte waarde in de inserted.VacationHours
kolom op de @MyTableVar
tabelvariabele.
Twee SELECT
instructies volgen die de waarden in @MyTableVar
en de resultaten van de updatebewerking in de Employee
tabel retourneren. Zie OUTPUT-component (Transact-SQL)voor meer voorbeelden van het gebruik van de OUTPUT-component.
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
UPDATE gebruiken in andere instructies
Voorbeelden in deze sectie laten zien hoe u UPDATE gebruikt in andere instructies.
BLOEDGROEP. UPDATE gebruiken in een opgeslagen procedure
In het volgende voorbeeld wordt een UPDATE-instructie gebruikt in een opgeslagen procedure. De procedure heeft één invoerparameter, @NewHours
en één uitvoerparameter @RowCount
. De parameterwaarde @NewHours
wordt gebruikt in de instructie UPDATE om de kolom VacationHours
in de tabel HumanResources.Employee
bij te werken. De @RowCount
uitvoerparameter wordt gebruikt om het aantal rijen dat is beïnvloed, te retourneren aan een lokale variabele. De CASE-expressie wordt gebruikt in de SET-component om de waarde die is ingesteld voor VacationHours
voorwaardelijk te bepalen. Wanneer de werknemer per uur wordt betaald (SalariedFlag
= 0), wordt VacationHours
ingesteld op het huidige aantal uren plus de waarde die is opgegeven in @NewHours
; anders wordt VacationHours
ingesteld op de waarde die is opgegeven in @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;
WISSELSPANNING. UPDATE gebruiken in een TRY... CATCH-blok
In het volgende voorbeeld wordt een UPDATE-instructie gebruikt in een TRY... CATCH-blok voor het afhandelen van uitvoeringsfouten die kunnen optreden tijdens de updatebewerking.
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
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
ADVERTENTIE. Een eenvoudige UPDATE-instructie gebruiken
In de volgende voorbeelden ziet u hoe alle rijen kunnen worden beïnvloed wanneer een WHERE-component niet wordt gebruikt om de rij (of rijen) op te geven die u wilt bijwerken.
In dit voorbeeld worden de waarden in de kolommen EndDate
en CurrentFlag
bijgewerkt voor alle rijen in de DimEmployee
tabel.
-- Uses AdventureWorks
UPDATE DimEmployee
SET EndDate = '2010-12-31', CurrentFlag='False';
U kunt ook berekende waarden gebruiken in een UPDATE-instructie. In het volgende voorbeeld wordt de waarde in de kolom ListPrice
verdubbeld voor alle rijen in de Product
tabel.
-- Uses AdventureWorks
UPDATE DimEmployee
SET BaseRate = BaseRate * 2;
AE. De UPDATE-instructie gebruiken met een WHERE-component
In het volgende voorbeeld wordt de WHERE-component gebruikt om op te geven welke rijen moeten worden bijgewerkt.
-- Uses AdventureWorks
UPDATE DimEmployee
SET FirstName = 'Gail'
WHERE EmployeeKey = 500;
AF. De UPDATE-instructie met label gebruiken
In het volgende voorbeeld ziet u het gebruik van een LABEL voor de UPDATE-instructie.
-- Uses AdventureWorks
UPDATE DimProduct
SET ProductSubcategoryKey = 2
WHERE ProductKey = 313
OPTION (LABEL = N'label1');
AG. De UPDATE-instructie gebruiken met informatie uit een andere tabel
In dit voorbeeld wordt een tabel gemaakt om de totale verkoop per jaar op te slaan. Hiermee wordt de totale verkoop voor het jaar 2004 bijgewerkt door een SELECT-instructie uit te voeren op basis van de tabel 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-join voor update-instructies
In dit voorbeeld ziet u hoe u gegevens bijwerkt op basis van het resultaat van het samenvoegen van een andere tabel.
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
Zie ook
CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
cursors (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
tekst- en afbeeldingsfuncties (Transact-SQL)
WITH common_table_expression (Transact-SQL)
filestream (SQL Server)
sortering en Unicode-ondersteuning
Single-Byte- en multibytetekensets