Delen via


UPDATE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse in Microsoft FabricSQL-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 Table1bij 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 Pointbijwerkt 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 naam SetXYaangeroepen. 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 gedefinieerde Point.

    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_owneren 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, CommissionPcten 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 800te 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 @datasrcmoet 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 Pointbijwerkt 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 SetXYaangeroepen. 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, @NewHoursen één uitvoerparameter @RowCount. De parameterwaarde @NewHours wordt gebruikt in de instructie UPDATE om de kolom VacationHours in de tabel HumanResources.Employeebij 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 VacationHoursvoorwaardelijk 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