Megosztás a következőn keresztül:


UPDATE (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse a Microsoft FabricSQL Database-ben a Microsoft Fabric

Egy tábla vagy nézet meglévő adatainak módosítása az SQL Serveren. Példák: Példák.

Transact-SQL szintaxis konvenciói

Szintaxis

-- 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 ) ]  
[;]  

Érvek

WITH <common_table_expression>
Az UPDATE utasítás hatókörében definiált ideiglenes elnevezett eredményhalmazt vagy nézetet (más néven common table expression, CTE) adja meg. A CTE-eredményhalmaz egy egyszerű lekérdezésből származik, és az UPDATE utasítás hivatkozik gombra.

Gyakori táblakifejezések a SELECT, INSERT, DELETE és CREATE VIEW utasításokkal is használhatók. További információ: WITH common_table_expression (Transact-SQL).

TOP (kifejezés) [ SZÁZALÉK ]
A frissített sorok számát vagy százalékát adja meg. kifejezés lehet a sorok száma vagy százaléka.

Az INSERT, UPDATE vagy DELETE kifejezésben használt TOP kifejezésben hivatkozott sorok nincsenek rendezve semmilyen sorrendben.

A TOP-ban kifejezés elválasztó zárójeleket az INSERT, a UPDATE és a DELETE utasításban kell megadni. További információ: TOP (Transact-SQL).

table_alias
Az UPDATE záradékban megadott alias, amely azt a táblát vagy nézetet jelöli, amelyről a sorokat frissíteni szeretné.

server_name
Annak a kiszolgálónak a neve (csatolt kiszolgálónév vagy OPENDATASOURCE függvény használata kiszolgálónévként), amelyen a tábla vagy a nézet található. Ha server_name van megadva, database_name és schema_name van szükség.

database_name
Az adatbázis neve.

schema_name
Annak a sémának a neve, amelyhez a tábla vagy nézet tartozik.

table_or_view_name
Annak a táblázatnak vagy nézetnek a neve, amelyből a sorokat frissíteni kell. A table_or_view_name által hivatkozott nézetnek frissíthetőnek kell lennie, és pontosan egy alaptáblára kell hivatkoznia a nézet FROM záradékában. Az frissíthető nézetekről további információt CREATE VIEW (Transact-SQL)című témakörben talál.

rowset_function_limited
A OPENQUERY vagy OPENROWSET függvény, a szolgáltatói képességek függvényében.

WITH (<Table_Hint_Limited>)
Egy vagy több, céltáblához engedélyezett táblamutatót ad meg. A WITH kulcsszó és a zárójelek megadása kötelező. A NOLOCK, a READUNCOMMITTED, a NOEXPAND és más elemek nem engedélyezettek. További információ a táblázat tippjeiről: Táblázatmutatók (Transact-SQL).

@ table_variable
Egy tábla változót határoz meg táblaforrásként.

BEÁLLÍT
Megadja a frissíteni kívánt oszlop- vagy változónevek listáját.

column_name
A módosítani kívánt adatokat tartalmazó oszlop. column_nametable_or view_namekell léteznie. Az identitásoszlopok nem frissíthetők.

kifejezés
Egy változó, literális érték, kifejezés vagy részkijelölési utasítás (zárójelekkel együtt), amely egyetlen értéket ad vissza. A kifejezés által visszaadott érték a column_name vagy @változómeglévő értékét váltja fel.

Jegyzet

Az nchar , nvarcharés ntextUnicode-karakter adattípusokra való hivatkozáskor a "kifejezés" előtaggal kell rendelkeznie az "N" nagybetűvel. Ha az "N" nincs megadva, az SQL Server átalakítja a sztringet az adatbázis vagy oszlop alapértelmezett rendezésének megfelelő kódlapra. A kódlapon nem található karakterek elvesznek.

ALAPÉRTELMEZETT
Azt adja meg, hogy az oszlophoz definiált alapértelmezett érték az oszlopban meglévő érték lecserélése. Ezzel az oszlopot NULL értékre is módosíthatja, ha az oszlop nem alapértelmezett, és a null értékek engedélyezésére van definiálva.

{ += | -= | *= | /= | %= | &= | ^= | |= }
Összetett hozzárendelés operátora:
+= Hozzáadás és hozzárendelés
-= Kivonás és hozzárendelés
*= Szorzás és hozzárendelés
/= Osztás és hozzárendelés
%= Modulo és hozzárendelés
&= Bitwise AND és hozzárendelés
^= Bitenkénti XOR és hozzárendelés
|= Bitenkénti VAGY és hozzárendelés

udt_column_name
Felhasználó által definiált típusoszlop.

property_name | field_name
Egy felhasználó által definiált típusú nyilvános tulajdonság vagy nyilvános adat tagja.

method_name(argumentum [ ,... n] )
A udt_column_name nemsztatikus nyilvános mutációs módszere, amely egy vagy több argumentumot vesz igénybe.

.WRITE (kifejezés,@eltolás,@hossz)
Megadja, hogy a column_name értékének egy szakaszát módosítani kell. kifejezés a @Hossz egységeket váltja fel a column_name@Eltolás. Ezzel a záradékkal csak varchar(max), nvarchar(max)vagy varbinary(max) oszlop adható meg. column_name nem lehet NULL értékű, és nem minősíthető táblanévvel vagy tábla aliasával.

kifejezés a column_name. kifejezésnek ki kell értékelnie vagy implicit módon át kell adni a column_name típusra. Ha kifejezés NULL értékre van állítva, a @Hossz figyelmen kívül lesz hagyva, a column_name értéke pedig a megadott @Eltolás.

@ eltolás a column_name tárolt érték kiindulási pontja, amelyen kifejezés íródik. @ eltolás nullaalapú sorszámú bájtpozíció, nagy, és nem lehet negatív szám. Ha a @Eltolás NULL értékű, a frissítési művelet hozzáfűzi kifejezést a meglévő column_name érték végén, és a @Hossz figyelmen kívül hagyja. Ha a @eltolás nagyobb, mint a column_name érték bájthossza, az adatbázismotor hibát ad vissza. Ha a @Eltolás és a @Hossz meghaladja az oszlopban lévő mögöttes érték végét, a törlés az érték utolsó karakterétől számítható ki.

@ Hossz az oszlop @Eltoláskezdetű szakaszának hossza, amelyet kifejezéshelyettesít. @ hossz, és nem lehet negatív szám. Ha a @Hossz NULL értékű, a frissítési művelet eltávolítja az összes adatot a @Eltolás a column_name érték végéig.

További információ: Nagy értékű adattípusok frissítése.

@ változók
Deklarált változó, amely az kifejezésáltal visszaadott értékre van állítva.

A SET @változó = oszlop = kifejezés a változót az oszlop értékére állítja. Ez eltér a SET @változótól = oszlop, = kifejezés, amely a változót az oszlop frissítés előtti értékére állítja.

<OUTPUT_Clause>
Frissített adatokat vagy kifejezéseket ad vissza az UPDATE művelet részeként. Az OUTPUT záradék nem támogatott a távoli táblákat vagy nézeteket megcélzó DML-utasításokban. A záradék argumentumairól és viselkedéséről további információt OUTPUT záradék (Transact-SQL)című cikkben talál.

FROM <table_source>
Megadja, hogy a rendszer tábla-, nézet- vagy származtatott táblaforrást használjon a frissítési művelet feltételeinek megadásához. További információ: FROM (Transact-SQL).

Ha a frissített objektum megegyezik a FROM záradékban szereplő objektummal, és a FROM záradékban csak egy hivatkozás található az objektumra, az objektum aliasa megadható vagy nem adható meg. Ha a frissített objektum többször is megjelenik a FROM záradékban, egy és csak egy, akkor az objektumra való hivatkozás nem adhat meg tábla aliast. A FROM záradékban az objektumra mutató összes többi hivatkozásnak tartalmaznia kell egy objektum aliasát.

A FRISSÍTÉS HELYETT eseményindítóval rendelkező nézet nem lehet a FROM záradékkal rendelkező UPDATE célhelye.

Jegyzet

A FROM záradékban található OPENDATASOURCE, OPENQUERY vagy OPENROWSET hívásokat a rendszer a frissítés céljaként használt függvények hívásától függetlenül, függetlenül értékeli, még akkor is, ha a két híváshoz azonos argumentumok vannak megadva. Az egyik ilyen hívás eredményére alkalmazott szűrési vagy illesztési feltételeknek nincs hatása a másik eredményére.

HOL
Megadja a frissített sorokat korlátozó feltételeket. A WHERE záradék melyik formája alapján két frissítési forma létezik:

  • A keresett frissítések olyan keresési feltételt adnak meg, amely minősíti a törölni kívánt sorokat.

  • A pozicionált frissítések a CURRENT OF záradékot használják a kurzor megadásához. A frissítési művelet a kurzor aktuális helyén történik.

<search_condition>
Megadja a frissíteni kívánt sorok teljesüléséhez szükséges feltételt. A keresési feltétel lehet az a feltétel is, amelyen az illesztés alapul. A keresési feltételben szereplő predikátumok száma nincs korlátozva. További információ a predikátumokról és a keresési feltételekről: Keresési feltétel (Transact-SQL).

AKTUÁLIS
Megadja, hogy a frissítés a megadott kurzor aktuális helyén legyen végrehajtva.

A WHERE CURRENT OF záradékot használó pozicionált frissítés frissíti az egyetlen sort a kurzor aktuális pozíciójánál. Ez pontosabb lehet, mint a where <search_condition> záradékot használó keresési frissítés a frissítendő sorok minősítéséhez. A keresési frissítés több sort módosít, ha a keresési feltétel nem azonosít egyedileg egyetlen sort.

GLOBÁLIS
Megadja, hogy cursor_name globális kurzorra hivatkozik.

cursor_name
Annak a nyitott kurzornak a neve, amelyből a beolvasást el kell készíteni. Ha cursor_name nevű globális és helyi kurzor is létezik, ez az argumentum a globális kurzorra hivatkozik, ha a GLOBAL van megadva; ellenkező esetben a helyi kurzorra hivatkozik. A kurzornak engedélyeznie kell a frissítéseket.

cursor_variable_name
A kurzorváltozó neve. cursor_variable_name egy olyan kurzorra kell hivatkoznia, amely lehetővé teszi a frissítéseket.

OPTION (<query_hint> [ ,... n ] )
Meghatározza, hogy az optimalizáló tippek segítségével szabja testre az adatbázismotor az utasítást. További információ: lekérdezési tippek (Transact-SQL).

Ajánlott eljárások

A @@ROWCOUNT függvénnyel adja vissza a beszúrt sorok számát az ügyfélalkalmazásnak. További információ: @@ROWCOUNT (Transact-SQL).

A változónevek az UPDATE utasításokban használhatók az érintett régi és új értékek megjelenítéséhez, de ez csak akkor használható, ha az UPDATE utasítás egyetlen rekordot érint. Ha az UPDATE utasítás több rekordot is érint, az egyes rekordok régi és új értékeinek visszaadásához használja a OUTPUT záradékot.

A FROM záradék megadásakor körültekintően adja meg a frissítési művelet feltételeit. Az UPDATE utasítás eredményei nem határozhatók meg, ha az utasítás tartalmaz egy FROM záradékot, amely nincs megadva oly módon, hogy csak egy érték legyen elérhető minden frissített oszlopeseményhez, vagyis ha az UPDATE utasítás nem determinisztikus. Például a következő szkript UPDATE utasításában Table1 mindkét sor megfelel az UPDATE utasítás FROM záradékának; de nincs meghatározva, hogy a Table1 melyik sorát használja a Table2.

USE AdventureWorks2022;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') isn't NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') isn't NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1   
    (ColA INT NOT NULL, ColB DECIMAL(10,3) NOT NULL);  
GO  
CREATE TABLE dbo.Table2   
    (ColA INT PRIMARY KEY NOT NULL, ColB DECIMAL(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);  
INSERT INTO dbo.Table2 VALUES(1, 0.0);  
GO  
UPDATE dbo.Table2   
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB  
FROM dbo.Table2   
    INNER JOIN dbo.Table1   
    ON (dbo.Table2.ColA = dbo.Table1.ColA);  
GO  
SELECT ColA, ColB   
FROM dbo.Table2;  

Ugyanez a probléma akkor fordulhat elő, ha a FROM és WHERE CURRENT OF záradékok egyesítve vannak. Az alábbi példában az Table2 mindkét sora megfelel a FROM záradék minősítésének a UPDATE utasításban. Nincs meghatározva, hogy a Table2 melyik sorát kell használni a Table1sorának frissítéséhez.

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  

Kompatibilitási támogatás

Az UPDATE vagy DELETE utasítás céltáblájára vonatkozó FROM záradékBAN található READUNCOMMITTED és NOLOCK tippek használatának támogatása az SQL Server egy későbbi verziójában megszűnik. Ne használja ezeket a tippeket ebben a környezetben az új fejlesztési munkában, és tervezze meg a jelenleg használt alkalmazások módosítását.

Adattípusok

Minden karakter és nchar oszlop a megadott hosszra van jobb párnázva.

Ha ANSI_PADDING KI értékre van állítva, az összes záró szóköz el lesz távolítva varchar és nvarchar oszlopokba beszúrt adatokból, kivéve a csak szóközöket tartalmazó sztringeket. Ezek a sztringek üres sztringre vannak csonkva. Ha ANSI_PADDING BE értékre van állítva, a rendszer beszúrja a záró szóközöket. A Microsoft SQL Server ODBC-illesztője és az SQL Server OLE DB-szolgáltatója automatikusan beállítja ANSI_PADDING ON-t minden kapcsolathoz. Ez konfigurálható ODBC-adatforrásokban vagy kapcsolati attribútumok vagy tulajdonságok beállításával. További információ: SET ANSI_PADDING (Transact-SQL).

Szöveg-, szöveg- és képoszlopok frissítése

Ha módosít egy szöveges, ntext, vagy kép oszlop frissítésével inicializálja az oszlopot, érvényes szövegmutatót rendel hozzá, és lefoglal legalább egy adatlapot, kivéve, ha az oszlopot NULL értékkel frissíti.

Ha szöveges, szövegesvagy kép adatok nagyméretű blokkjainak cseréjéhez vagy módosításához az UPDATE utasítás helyett WRITETEXT vagy UPDATETEXT kell használnia.

Ha az UPDATE utasítás több sort is módosíthat a fürtözési kulcs és egy vagy több szöveges, ntextvagy kép oszlopok frissítése közben, az oszlopok részleges frissítése az értékek teljes cseréjeként lesz végrehajtva.

Fontos

A ntext, szövegés kép adattípusok a Microsoft SQL Server egy későbbi verziójában lesznek eltávolítva. Ne használja ezeket az adattípusokat az új fejlesztési munkában, és tervezze meg a jelenleg használt alkalmazások módosítását. Használja nvarchar(max), varchar(max), és varbinary(max).

Nagy értékű adattípusok frissítése

Használja a .WRITE (kifejezés,@Eltolás,@Hossz) záradékot, amely részleges vagy teljes frissítést hajt végre varchar(max), nvarchar(max)és varbinary(max) adattípusokat.

Előfordulhat például, hogy egy varchar(max) oszlop részleges frissítése csak az oszlop első 200 bájtját (ASCII-karakterek használata esetén 200 karaktert) töröl vagy módosít, míg egy teljes frissítés az oszlop összes adatát törli vagy módosítja. . A WRITE az új adatokat beszúró vagy hozzáfűző frissítéseket a rendszer minimálisan naplózza, ha az adatbázis-helyreállítási modell tömegesen naplózott vagy egyszerű. A meglévő értékek frissítésekor a rendszer nem használ minimális naplózást. További információ: A tranzakciónapló (SQL Server).

Az adatbázismotor egy részleges frissítést teljes frissítéssé alakít át, ha az UPDATE utasítás a következő műveletek valamelyikét okozza:

  • Módosítja a particionált nézet vagy tábla kulcsoszlopát.
  • Egynél több sort módosít, és frissíti a nemunikus fürtözött index kulcsát egy nem konzisztens értékre.

A nem használható. A WRITE záradék egy NULL oszlop frissítéséhez vagy a column_name értékének NULL értékre való beállításához.

@ Eltolás és @Hosszvarbináris és varchar adattípusokhoz és bájtpárokban vannak megadva a nvarchar adattípushoz. További információ a sztring adattípusának hosszáról: karakter és varchar (Transact-SQL) és nchar és nvarchar (Transact-SQL).

A legjobb teljesítmény érdekében javasoljuk, hogy az adatokat 8040 bájt többszörös méretű adattömbökbe szúrja be vagy frissítse.

Ha az oszlopot a módosította. A WRITE záradékra egy OUTPUT záradék hivatkozik, amely az oszlop teljes értéke, vagy az előző kép törölve.column_name vagy az azt követő kép beszúrva.column_namea táblaváltozó megadott oszlopába kerül vissza. Lásd az alábbi R példát.

A ugyanazon funkcióinak elérése érdekében. A WRITE más karakterekkel vagy bináris adattípusokkal, használja a STUFF (Transact-SQL).

Felhasználó által definiált típusoszlopok frissítése

A felhasználó által definiált típusú oszlopok értékeinek frissítése az alábbi módokon végezhető el:

  • Érték megadása SQL Server-rendszer adattípusban, amennyiben a felhasználó által definiált típus támogatja az adott típus implicit vagy explicit konvertálását. Az alábbi példa bemutatja, hogyan frissíthet egy értéket a felhasználó által definiált típusú Pointoszlopban, ha explicit módon konvertál egy sztringet.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • A felhasználó által megadott típusú, mutációként megjelölt metódus meghívása a frissítés végrehajtásához. Az alábbi példa egy SetXYnevű Point típusú mutációs metódust hív meg. Ez frissíti a típuspéldány állapotát.

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

    Jegyzet

    Az SQL Server hibát ad vissza, ha egy mutációs metódust Transact-SQL null értéken hív meg, vagy ha a mutációs metódus által előállított új érték null.

  • A felhasználó által megadott típusú regisztrált tulajdonság vagy nyilvános adat tag értékének módosítása. Az értéket tartalmazó kifejezésnek implicit módon konvertálhatónak kell lennie a tulajdonság típusára. Az alábbi példa a felhasználó által definiált Pointtulajdonság X értékét módosítja.

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

    Ugyanazon felhasználó által definiált típusoszlop különböző tulajdonságainak módosításához adjon ki több UPDATE utasítást, vagy hívjon meg egy ilyen típusú mutációs metódust.

FILESTREAM-adatok frissítése

Az UPDATE utasítással null értékűre, üres értékre vagy viszonylag kis mennyiségű beágyazott adatra frissítheti a FILESTREAM mezőt. Azonban a Win32-felületek használatával nagy mennyiségű adat streamelhető a fájlba. A FILESTREAM mező frissítésekor módosítja a fájlrendszer mögöttes BLOB-adatait. Ha a FILESTREAM mező NULL értékűre van állítva, a mezőhöz társított BLOB-adatok törlődnek. Nem használható. WRITE(), a FILESTREAM-adatok részleges frissítésének végrehajtásához. További információ: FILESTREAM (SQL Server).

Hibakezelés

Ha egy sor frissítése megsért egy kényszert vagy szabályt, megsérti az oszlop NULL beállítását, vagy az új érték nem kompatibilis adattípus, az utasítás megszakad, a rendszer hibát ad vissza, és nem frissülnek a rekordok.

Ha egy UPDATE utasítás számtani hibát (túlcsordulás, nullával való osztás vagy tartományhiba) tapasztal a kifejezés kiértékelése során, a frissítés nem lesz végrehajtva. A köteg többi része nem lesz végrehajtva, és hibaüzenet jelenik meg.

Ha egy fürtözött indexben részt vevő oszlop vagy oszlopok frissítése miatt a fürtözött index mérete és a sor mérete meghaladja a 8060 bájtot, a frissítés meghiúsul, és hibaüzenet jelenik meg.

Interoperabilitás

Az UPDATE utasítások csak akkor engedélyezettek a felhasználó által definiált függvények törzsében, ha a módosítandó tábla táblaváltozó.

Ha egy INSTEAD OF eseményindítót határoz meg egy tábla UPDATE műveleteiben, az eseményindító az UPDATE utasítás helyett fut. Az SQL Server korábbi verziói csak az UPDATE-en és más adatmódosítási utasításokon definiált AFTER-eseményindítókat támogatják. A FROM záradék nem adható meg olyan UPDATE utasításban, amely közvetlenül vagy közvetve hivatkozik egy INSTEAD OF eseményindítóval definiált nézetre. Az eseményindítók helyett további információkért lásd CREATE TRIGGER (Transact-SQL).

A FROM záradék jelenleg nem adható meg a Microsoft Fabric raktárában található UPDATE utasításban. Az egytáblás UPDATE utasítások támogatottak.

Korlátozások és korlátozások

A FROM záradék nem adható meg olyan UPDATE utasításban, amely közvetlenül vagy közvetve hivatkozik egy olyan nézetre, amelyen egy INSTEAD OF eseményindító van definiálva. Az INSTEAD OF eseményindítókkal kapcsolatos további információkért lásd: CREATE TRIGGER (Transact-SQL).

Ha az UPDATE utasítás célja egy közös táblakifejezés (CTE), az utasítás CTE-jára mutató összes hivatkozásnak egyeznie kell. Ha például a CTE-hez alias van rendelve a FROM záradékban, az aliast kell használni a CTE-ra mutató összes többi hivatkozáshoz. Egyértelmű CTE-hivatkozásokra azért van szükség, mert a CTE nem rendelkezik objektumazonosítóval, amelyet az SQL Server az objektum és az alias közötti implicit kapcsolat felismerésére használ. E kapcsolat nélkül a lekérdezési terv váratlan illesztési viselkedést és nem várt lekérdezési eredményeket eredményezhet. Az alábbi példák a CTE megadásának helyes és helytelen módszereit mutatják be, amikor a CTE a frissítési művelet célobjektuma.

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  

Itt van az eredményhalmaz.

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

UPDATE utasítás helytelenül egyező CTE-hivatkozásokkal.

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  

Itt van az eredményhalmaz.

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

Zárolási viselkedés

Az UPDATE utasítás kizárólagos (X) zárolást szerez be az általa módosított sorokra, és ezeket a zárolásokat a tranzakció befejezéséig tárolja. Az UPDATE utasítás lekérdezési tervétől, a módosítandó sorok számától és a tranzakció elkülönítési szintjétől függően a zárolások a sorszint helyett az oldal vagy a táblázat szintjén szerezhetőek be. A magasabb szintű zárolások elkerülése érdekében fontolja meg a több ezer sort vagy annál több sort érintő frissítési utasítások kötegekre való felosztását, és győződjön meg arról, hogy az indexek támogatják az illesztési és szűrési feltételeket. Az SQL Server zárolási mechanizmusával kapcsolatos további részletekért tekintse meg az adatbázismotor zárolásáról szóló cikket.

Ha az optimalizált zárolás engedélyezve van, a zárolási viselkedés néhány aspektusa UPDATE megváltozik. A kizárólagos (X) zárolások például csak a tranzakció befejezéséig lesznek tárolva. További információ: Optimalizált zárolási.

Naplózási viselkedés

A rendszer naplózza az UPDATE utasítást; azonban részlegesen frissülnek a nagy értékű adattípusok a használatával. A WRITE záradék minimálisan naplózva van. További információ: "Nagy értékű adattípusok frissítése" az "Adattípusok" című korábbi szakaszban.

Biztonság

Engedélyek

UPDATE engedélyekre van szükség a céltáblában. SELECT a frissítendő tábla engedélyére is szükség van, ha az UPDATE utasítás TARTALMAZ EGY WHERE záradékot, vagy ha KIFEJEZÉS a SET záradékban egy oszlopot használ a táblában.

A FRISSÍTÉSi engedélyek alapértelmezés szerint a sysadmin rögzített kiszolgálói szerepkör, a db_owner és db_datawriter rögzített adatbázis-szerepkörök, valamint a táblatulajdonos tagjai számára. A sysadmin, db_ownerés db_securityadmin szerepkörök tagjai és a táblatulajdonos más felhasználók számára is átadhatnak engedélyeket.

Példák

Kategória Kiemelt szintaxiselemek
Alapszintű szintaxis FRISSÍT
Frissített sorok korlátozása WHERE * TOP * WITH common table expression * WHERE CURRENT OF
Oszlopértékek beállítása számított értékek * összetett operátorok * alapértelmezett értékek * allekérdezések
Standard tábláktól eltérő célobjektumok megadása views * table variables * table aliases
Adatok frissítése más táblákból származó adatok alapján TÓL
Sorok frissítése távoli tábla csatolt kiszolgáló * OPENQUERY * OPENDATASOURCE
nagyméretű objektum adattípusainak frissítése . ÍRÁS * OPENROWSET
Felhasználó által definiált típusok frissítése felhasználó által definiált típusok
Lekérdezésoptimalizáló alapértelmezett viselkedésének felülbírálása tippek táblamutatók * lekérdezési tippek
AZ UPDATE utasítás eredményeinek rögzítése OUTPUT záradék
AZ UPDATE használata más utasításokban Tárolt eljárások * TRY... ELKAP

Alapszintű szintaxis

Az ebben a szakaszban található példák az UPDATE utasítás alapvető funkcióit mutatják be a minimálisan szükséges szintaxis használatával.

Egy. Egyszerű UPDATE utasítás használata

Az alábbi példa egyetlen oszlopot frissít a Person.Address tábla összes sorához.

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

B. Több oszlop frissítése

Az alábbi példa frissíti a Bonus, CommissionPctés SalesQuota oszlop értékeit a SalesPerson tábla összes sorához.

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

A frissített sorok korlátozása

Az ebben a szakaszban szereplő példák bemutatják, hogyan korlátozhatja az UPDATE utasítás által érintett sorok számát.

C. A WHERE záradék használata

Az alábbi példa a WHERE záradékot használja a frissíteni kívánt sorok megadásához. Az utasítás frissíti a Production.Product tábla Color oszlopában lévő értéket az összes olyan sor esetében, amelynek a Color oszlopában már szerepel "Piros" érték, és az Name oszlopban van egy érték, amely a "Road-250" kezdetű.

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

D. A TOP záradék használata

Az alábbi példák a TOP záradék használatával korlátozzák az UPDATE utasításban módosított sorok számát. Ha egy TOP (n) záradékot használ az UPDATE-hez, a frissítési műveletet a rendszer véletlenszerűen kiválasztja a sorok számátn. Az alábbi példa 25%-kal frissíti a VacationHours oszlopot a Employee tábla 10 véletlenszerű sorához.

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

Ha a TOP-ot kell használnia a frissítések értelmes kronológiában való alkalmazásához, akkor a TOP és az ORDER BY együttes használatát kell használnia egy alkijelölési utasításban. Az alábbi példa a 10 alkalmazott szabadságát frissíti a legkorábbi felvételi dátumokkal.

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. A WITH common_table_expression záradék használata

Az alábbi példa frissíti a PerAssemblyQty értéket az összes olyan alkatrész és összetevő esetében, amelyet közvetlenül vagy közvetve használnak a ProductAssemblyID 800létrehozásához. A közös táblakifejezés egy hierarchikus listát ad vissza azoknak a részeknek a hierarchikus listájáról, amelyek közvetlenül a ProductAssemblyID 800 és az összetevők létrehozásához használt alkatrészeket készítik, és így tovább. A rendszer csak a közös táblakifejezés által visszaadott sorokat módosítja.

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. A WHERE CURRENT OF záradék használata

Az alábbi példa a WHERE CURRENT OF záradékot használja arra, hogy csak azt a sort frissítse, amelyen a kurzor elhelyezve van. Ha a kurzor illesztésen alapul, a rendszer csak az UPDATE utasításban megadott table_name módosítja. A kurzorban részt vevő egyéb táblákra nincs hatással.

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  

Oszlopértékek beállítása

Az ebben a szakaszban szereplő példák az oszlopok számított értékek, al lekérdezések és ALAPÉRTELMEZETT értékek használatával történő frissítését mutatják be.

G. Számított érték megadása

Az alábbi példák egy UPDATE utasításban számított értékeket használnak. A példa megduplázza a ListPrice oszlop értékét a Product tábla összes sorában.

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

H. Összetett operátor megadása

Az alábbi példa a @NewPrice változót használja az összes piros kerékpár árának növeléséhez az aktuális ár figyelembe vételével és 10-zel való hozzáadásával.

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

Az alábbi példa az összetett operátor += használatával fűzi hozzá az ' - tool malfunction' az oszlop meglévő értékéhez, Name olyan sorokhoz, amelyek 10 és 12 közötti ScrapReasonID rendelkeznek.

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

Én. Alquery megadása a SET záradékban

Az alábbi példa a SET záradék egy al lekérdezését használja az oszlop frissítéséhez használt érték meghatározásához. Az al lekérdezésnek csak skaláris értéket kell visszaadnia (azaz soronként egyetlen értéket). A példa a SalesPerson tábla SalesYTD oszlopát módosítja, hogy az tükrözze a SalesOrderHeader táblában rögzített legutóbbi értékesítéseket. Az albekérdezés összesíti az egyes értékesítők értékesítéseit a UPDATE utasításban.

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. Sorok frissítése ALAPÉRTELMEZETT értékekkel

Az alábbi példa az CostRate oszlopot az alapértelmezett értékre (0,00) állítja be az összes olyan sor esetében, amelynek CostRate értéke nagyobb, mint 20.00.

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

A standard tábláktól eltérő célobjektumok megadása

Az ebben a szakaszban szereplő példák bemutatják, hogyan frissítheti a sorokat nézet, tábla alias vagy táblaváltozó megadásával.

K. Nézet megadása célobjektumként

Az alábbi példa egy tábla sorait frissíti a célobjektumként megadott nézet megadásával. A nézetdefiníció több táblára hivatkozik, az UPDATE utasítás azonban sikeres, mert csak az egyik mögöttes tábla oszlopára hivatkozik. Az UPDATE utasítás sikertelen lenne, ha mindkét tábla oszlopai meg lettek adva. További információ: Adatok módosítása nézeten keresztül.

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

L. Tábla aliasának megadása célobjektumként

Az alábbi példa a Production.ScrapReasontáblázat sorait frissíti. A FROM záradékban ScrapReason hozzárendelt tábla aliasa célobjektumként van megadva az UPDATE záradékban.

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. Táblaváltozó megadása célobjektumként

Az alábbi példa egy táblaváltozó sorait frissíti.

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  

Adatok frissítése más táblák adatai alapján

Az ebben a szakaszban szereplő példák bemutatják az egyik tábla sorainak egy másik tábla információi alapján történő frissítésének módszereit.

N. Az UPDATE utasítás használata egy másik táblából származó információkkal

Az alábbi példa a SalesPerson tábla SalesYTD oszlopát módosítja, hogy az tükrözze a SalesOrderHeader táblában rögzített legutóbbi értékesítéseket.

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  

Az előző példa feltételezi, hogy egy adott dátumon csak egy értékesítés van rögzítve egy adott értékesítő számára, és hogy a frissítések aktuálisak. Ha egy adott értékesítő több eladását is rögzítheti ugyanazon a napon, a bemutatott példa nem működik megfelelően. A példa hiba nélkül fut, de minden SalesYTD érték csak egy értékesítéssel frissül, függetlenül attól, hogy az adott napon ténylegesen hány értékesítés történt. Ennek az az oka, hogy egyetlen UPDATE utasítás kétszer sem frissíti ugyanazt a sort.

Abban az esetben, ha egy adott értékesítőnek ugyanazon a napon több értékesítés is történhet, az egyes értékesítők összes értékesítését össze kell vonni a UPDATE utasításban, ahogyan az a következő példában látható:

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  

Sorok frissítése távoli táblában

Az ebben a szakaszban szereplő példák bemutatják, hogyan frissíthetők a távoli céltáblák sorai egy csatolt kiszolgáló vagy sorhalmazfüggvény a távoli táblára való hivatkozáshoz.

O. Távoli tábla adatainak frissítése csatolt kiszolgáló használatával

Az alábbi példa egy távoli kiszolgálón frissít egy táblát. A példa a távoli adatforrásra mutató hivatkozás sp_addlinkedserverhasználatával történő létrehozásával kezdődik. A csatolt kiszolgáló neve (MyLinkedServer) ezután a négyrészes objektumnév részeként lesz megadva a server.catalog.schema.object űrlapon. Vegye figyelembe, hogy érvényes kiszolgálónevet kell megadnia @datasrc.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_nameinstance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkedServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI10',   
    @datasrc = N'<server name>',  
    @catalog = N'AdventureWorks2022';  
GO  
USE AdventureWorks2022;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
UPDATE MyLinkedServer.AdventureWorks2022.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

P. Adatok frissítése távoli táblában az OPENQUERY függvény használatával

Az alábbi példa egy távoli tábla sorait frissíti az OPENQUERY sorhalmazfüggvény megadásával. Ebben a példában az előző példában létrehozott csatolt kiszolgálónevet használjuk.

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

Q. Adatok frissítése távoli táblában az OPENDATASOURCE függvénnyel

Az alábbi példa egy távoli tábla sorait frissíti az OPENDATASOURCE sorhalmazfüggvény megadásával. Adjon meg érvényes kiszolgálónevet az adatforráshoz server_name vagy server_name\instance_nameformátum használatával. Előfordulhat, hogy konfigurálnia kell az SQL Server példányát az alkalmi elosztott lekérdezésekhez. További információ: alkalmi elosztott lekérdezések kiszolgálókonfigurációs beállítás.

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

Nagyméretű objektum adattípusainak frissítése

Az ebben a szakaszban szereplő példák bemutatják a nagy objektumtípusokkal (LOB) definiált oszlopok értékeinek frissítési módszereit.

R. Az UPDATE használata a következővel: . ÍRÁS egy nvarchar(max) oszlopban lévő adatok módosításához

Az alábbi példa a . WRITE záradék a DocumentSummaryegy részleges értékének frissítéséhez, nvarchar(max) oszlopot a Production.Document táblában. A components szót a features szóra cseréli a meglévő adatokban lecserélendő szó kezdőhelyének (eltolásának) és a lecserélendő karakterek számának (hosszának) megadásával. A példa a OUTPUT záradékot is használja a DocumentSummary oszlop előtti és utáni képének visszaadásához a @MyTableVar táblaváltozóhoz.

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. Az UPDATE használata a következővel: . ÍRÁS egy nvarchar(max) oszlopban lévő adatok hozzáadásához és eltávolításához

Az alábbi példák egy olyan nvarchar(max) oszlopból adnak hozzá és távolítanak el adatokat, amelyek értéke jelenleg NULL. Mert a . A WRITE záradék nem használható NULL oszlop módosítására, az oszlopot először ideiglenes adatok töltik ki. Ezeket az adatokat ezután a megfelelő adatokra cseréli a rendszer a . WRITE záradék. A további példák adatokat fűznek az oszlop értékének végéhez, eltávolítják (csonkolják) az adatokat az oszlopból, és végül eltávolítják a részleges adatokat az oszlopból. A SELECT utasítások az egyes UPDATE-utasítások által generált adatmódosítást jelenítik meg.

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. Az UPDATE és az OPENROWSET használata a varbinary(max) oszlop módosításához

Az alábbi példa egy varbinary(max) oszlopban tárolt meglévő lemezképet egy új képre cseréli. Az OPENROWSET függvény a TÖMEGES beállítással tölti be a képet az oszlopba. Ez a példa feltételezi, hogy egy Tires.jpg nevű fájl létezik a megadott fájl elérési útján.

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

U. AZ UPDATE használata a FILESTREAM-adatok módosításához

Az alábbi példa az UPDATE utasítást használja a fájlrendszerfájlban lévő adatok módosításához. Ezt a módszert nem javasoljuk nagy mennyiségű adat fájlba való streameléséhez. Használja a megfelelő Win32-interfészeket. Az alábbi példa a fájlrekordban lévő szövegeket a Xray 1szövegre cseréli. További információ: FILESTREAM (SQL Server).

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

Felhasználó által definiált típusok frissítése

Az alábbi példák a CLR felhasználó által definiált típusú (UDT) oszlopaiban módosítják az értékeket. Három módszert mutatunk be. További információ a felhasználó által definiált oszlopokról: CLR User-Defined Types.

V. Rendszeradat-típus használata

Az UDT-t úgy frissítheti, hogy megad egy értéket egy SQL Server-rendszer adattípusában, feltéve, hogy a felhasználó által definiált típus támogatja az adott típus implicit vagy explicit konvertálását. Az alábbi példa bemutatja, hogyan frissíthet egy értéket a felhasználó által definiált típusú Pointoszlopban, ha explicit módon konvertál egy sztringet.

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

W. Metódus meghívása

Az UDT-t úgy frissítheti, hogy egy, a felhasználó által megadott típusú, mutációként megjelölt metódust invoktál a frissítés végrehajtásához. Az alábbi példa egy SetXYnevű Point típusú mutációs metódust hív meg. Ez frissíti a típuspéldány állapotát.

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

X. Tulajdonság vagy adattag értékének módosítása

Az UDT-t úgy frissítheti, hogy módosítja egy regisztrált tulajdonság vagy a felhasználó által megadott típusú nyilvános adat tag értékét. Az értéket tartalmazó kifejezésnek implicit módon konvertálhatónak kell lennie a tulajdonság típusára. Az alábbi példa a felhasználó által definiált Pointtulajdonság X értékét módosítja.

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

A lekérdezésoptimalizáló alapértelmezett viselkedésének felülbírálása tippek használatával

Az ebben a szakaszban található példák bemutatják, hogyan használható tábla és lekérdezési tippek a lekérdezésoptimalizáló alapértelmezett viselkedésének ideiglenes felülbírálására az UPDATE utasítás feldolgozásakor.

Figyelmeztet

Mivel az SQL Server lekérdezésoptimalizálója általában a legjobb végrehajtási tervet választja ki egy lekérdezéshez, javasoljuk, hogy a tippeket csak a tapasztalt fejlesztők és adatbázis-rendszergazdák használják végső megoldásként.

Y. Táblázatos tipp megadása

Az alábbi példa a TABLOCK táblamutatót adja meg. Ez a tipp azt határozza meg, hogy a rendszer egy megosztott zárolást hoz létre a Production.Product táblában, és az UPDATE utasítás végéig tart.

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

Z. Lekérdezési tipp megadása

Az alábbi példa az UPDATE utasításban OPTIMIZE FOR (@variable)lekérdezési tippet adja meg. Ez a tipp arra utasítja a lekérdezés-optimalizálót, hogy a lekérdezés lefordításakor és optimalizálásakor egy adott értéket használjon egy helyi változóhoz. Az érték csak a lekérdezés optimalizálása során használatos, a lekérdezés végrehajtásakor nem.

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

Az UPDATE utasítás eredményeinek rögzítése

Az ebben a szakaszban szereplő példák bemutatják, hogyan használható a OUTPUT záradék az UPDATE utasítás által érintett minden sorból származó információk vagy kifejezések visszaadására. Ezeket az eredményeket vissza lehet adni a feldolgozó alkalmazásnak olyan célokra, mint a megerősítést kérő üzenetek, az archiválás és más ilyen alkalmazáskövetelmények.

AA. AZ UPDATE használata a OUTPUT záradékkal

Az alábbi példa 25 százalékkal frissíti a Employee táblában lévő VacationHours oszlopot a 10-nél kevesebb szabadságidővel rendelkező alkalmazottak esetében, és a ModifiedDate oszlop értékét is az aktuális dátumra állítja. A OUTPUT záradék a deleted.VacationHours oszlopban lévő UPDATE utasítás alkalmazása előtt létező VacationHours értékét adja vissza, a inserted.VacationHours oszlop frissített értékét pedig a @MyTableVar táblaváltozóra.

Két SELECT utasítás követi a @MyTableVar értékeit és a frissítési művelet eredményeit a Employee táblában. Az OUTPUT záradékot használó további példákért lásd OUTPUT záradékot (Transact-SQL).

USE AdventureWorks2022;  
GO  

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

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

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

Az UPDATE használata más utasításokban

Az ebben a szakaszban szereplő példák bemutatják, hogyan használható az UPDATE más utasításokban.

VÉRCSOPORT. AZ UPDATE használata tárolt eljárásban

Az alábbi példa egy UPDATE utasítást használ egy tárolt eljárásban. Az eljárás egy bemeneti paramétert, @NewHoursés egy kimeneti paramétert @RowCount. A @NewHours paraméter értéke az UPDATE utasításban a HumanResources.Employeetábla VacationHours oszlopának frissítésére szolgál. A @RowCount kimeneti paraméter a helyi változó által érintett sorok számának visszaadására szolgál. A CASE kifejezés a SET záradékban a VacationHoursbeállított érték feltételes meghatározására szolgál. Ha az alkalmazottat óránként fizetik (SalariedFlag = 0), a VacationHours az aktuális óraszám és a @NewHours; ellenkező esetben a VacationHours a @NewHours.

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

AC. UPDATE használata TRY-ban... CATCH blokk

Az alábbi példa egy UPDATE utasítást használ a TRY... CATCH-blokk a frissítési művelet során esetlegesen előforduló végrehajtási hibák kezelésére.

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  

Példák: Azure Synapse Analytics and Analytics Platform System (PDW)

HIRDETÉS. Egyszerű UPDATE utasítás használata

Az alábbi példák bemutatják, hogyan befolyásolható az összes sor, ha a WHERE záradék nem a frissíteni kívánt sor (vagy sorok) megadására szolgál.

Ez a példa frissíti a EndDate és CurrentFlag oszlop értékeit a DimEmployee tábla összes sorához.

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

A kiszámított értékeket az UPDATE utasításban is használhatja. Az alábbi példa a Product tábla összes sorának ListPrice oszlopában lévő értéket megduplázza.

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

Æ. AZ UPDATE utasítás használata WHERE záradékkal

Az alábbi példa a WHERE záradékot használja a frissíteni kívánt sorok megadásához.

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

AF. Az UPDATE utasítás használata címkével

Az alábbi példa a LABEL használatát mutatja be az UPDATE utasításhoz.

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

AG. Az UPDATE utasítás használata egy másik táblából származó információkkal

Ez a példa egy táblát hoz létre a teljes értékesítés évenkénti tárolásához. Frissíti a 2004-es évre vonatkozó összes értékesítést egy SELECT utasítás futtatásával a FactInternetSales táblában.

-- 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-csatlakozás frissítési utasításokhoz

Ez a példa bemutatja, hogyan frissítheti az adatokat egy másik táblához való csatlakozás eredménye alapján.

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

Lásd még:

CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
kurzorok (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
Szöveg- és képfüggvények (Transact-SQL)
WITH common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)
rendezés és Unicode-támogatás
Single-Byte és többbájtos karakterkészletek