UPDATE (Transact-SQL)
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Warehouse a Microsoft Fabric
SQL 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 Table1
sorá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ú
Point
oszlopban, 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
SetXY
nevű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
Point
tulajdonságX
é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 800
lé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.ScrapReason
tá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 DocumentSummary
egy 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 1
szö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ú Point
oszlopban, 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 SetXY
nevű 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 Point
tulajdonsá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.Employee
tá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 VacationHours
beá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