Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
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
Syntax
-- Syntax for SQL Server and Azure SQL Database
[ WITH <common_table_expression> [...n] ]
UPDATE
[ TOP ( expression ) [ PERCENT ] ]
{ { table_alias | <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
| @table_variable
}
SET
{ column_name = { expression | DEFAULT | NULL }
| { udt_column_name.{ { property_name = expression
| field_name = expression }
| method_name ( argument [ ,...n ] )
}
}
| column_name { .WRITE ( expression , @Offset , @Length ) }
| @variable = expression
| @variable = column = expression
| column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
| @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
| @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
} [ ,...n ]
[ <OUTPUT Clause> ]
[ FROM{ <table_source> } [ ,...n ] ]
[ WHERE { <search_condition>
| { [ CURRENT OF
{ { [ GLOBAL ] cursor_name }
| cursor_variable_name
}
]
}
}
]
[ OPTION ( <query_hint> [ ,...n ] ) ]
[ ; ]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name}
-- Syntax for Azure Synapse Analytics and Microsoft Fabric
[ WITH <common_table_expression> [ ,...n ] ]
UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name
SET { column_name = { expression | NULL } } [ ,...n ]
FROM [ database_name . [ schema_name ] . | schema_name . ] table_name
JOIN {<join_table_source>}[ ,...n ]
ON <join_condition>
[ WHERE <search_condition> ]
[ OPTION ( LABEL = label_name ) ]
[;]
<join_table_source> ::=
{
[ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias
[ <tablesample_clause>]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
}
-- Syntax for Parallel Data Warehouse
UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name
SET { column_name = { expression | NULL } } [ ,...n ]
[ FROM from_clause ]
[ WHERE <search_condition> ]
[ OPTION ( LABEL = label_name ) ]
[;]
Arguments
A COMMON_TABLE_EXPRESSION <>
Megadja az ideiglenes nevelt eredményhalmazt vagy nézetet, más néven közös táblakifejezést (CTE), amely az UPDATE állítás hatókörén belül definiál. A CTE eredményhalmaza egy egyszerű lekérdezésből származik, és állítással UPDATE hivatkozik rá.
Gyakori táblázatkifejezések használhatók a SELECT, INSERT, DELETE, és CREATE VIEW utasításokkal is. 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.
A TOP kifejezésben hivatkozott sorok, amelyeket , INSERTUPDATE, vagy DELETE nem rendeznek el semmilyen sorrendben.
A TOP kifejezést határoló zárójelek szükségesek , INSERTUPDATE, és DELETE állításokban. További információ: TOP (Transact-SQL).
table_alias
Az álnév, amelyet a UPDATE táblázat vagy nézet jelképez, amelyből a sorokat frissíteni kell.
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. További információért a frissíthető nézetekről lásd CREATE VIEW (Transact-SQL).
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.
SET
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.
expression
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.
Note
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.
DEFAULT
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ó
Deklarált változó, amely az kifejezésáltal visszaadott értékre van állítva.
SET @ változó = = oszlopaz expression a változót ugyanarra az értékre állítja be, mint az oszlop. Ez eltér a SET@változóoszlop = ésoszlopkifejezéstől = , amely a változót az oszlop előzetes frissítési értékéhez állítja be.
<OUTPUT_Clause>
Frissített adatokat vagy kifejezéseket ad vissza az adott művelet részeként UPDATE . 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.
A <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.
Egy nézet, amelynek HELYETTE UPDATE OF trigger van, nem lehet célpontja annak UPDATE , amelynek FROM záradéka van.
Note
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.
WHERE
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).
JELENLEGI TERÜLET
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.
GLOBAL
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.
OPCIÓ (<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óért lásd: @@ROWCOUNT (Transact-SQL).
A változónevek használhatók az UPDATE utasításokban a régi és új értékek megmutatására, de ezt csak akkor szabad alkalmazni, ha az UPDATE állítás egyetlen rekordot érint. Ha az utasítás UPDATE több rekordot érint, a régi és új értékek visszaadásához használjuk az 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 állítás UPDATE eredményei nem definiáltak, ha az állítás tartalmaz egy FROM klauzulát, amely nincs megadva, úgy, hogy minden frissített oszlop előfordulására csak egy érték áll rendelkezésre, vagyis ha az UPDATE állítás nem determinisztika. Például a következő szkriptben lévő UPDATE utasításban mindkét sor Table1 megfelel a FROM klauzula feltételeinek az UPDATE állításban; de nincs meghatározva, melyik sor kerül Table1 a sorba frissítéséhez 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
A FROM-kitűzésben található READUNCOMMITTED és NOLOCK tippek támogatása, amelyek az or DELETE utasítás céltáblájára UPDATE vonatkoznak, eltávolításra kerülnek a jövőbeli SQL Server verzióban. 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 OFF-ra van állítva, minden záró szóköz eltávolítódik a varchar és nvarchar oszlopokba beillesztett adatból, kivéve olyan stringeket, amelyek csak tereket tartalmaznak. Ezek a sztringek üres sztringre vannak csonkva. Ha ANSI_PADDING ON-ra van állítva, akkor a hátsó tereket illesztjük be. A Microsoft SQL Server ODBC illezőprogram és az OLE DB Provider for SQL Server automatikusan bekapcsolja ANSI_PADDING minden kapcsolatot. 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
Egy szöveg, ntext vagy kép oszlop módosítása UPDATE inicializálja az oszlopot, egy érvényes szövegmutatót rendel hozzá, és legalább egy adatoldalt kijelöl, kivéve, ha az oszlopot NULL-mal frissítik.
A nagy szöveg-, ntext- vagy képadatok blokkainak cseréjéhez vagy módosításához a WRITETEXT vagy UPDATETEXT utasítás UPDATE helyett a WRITETEXT vagy UPDATETEXT használatát használjuk.
Ha az UPDATE utasítás több sort is képes változtatni, miközben frissíti mind a klaszterkulcsot, mind egy vagy több szöveg-, ntext- vagy képoszlopot , akkor ezeknek az oszlopoknak a részleges frissítése teljes értékek cseréjeként történik.
Important
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 Database Engine egy részleges frissítést teljes frissítésré alakít, ha az UPDATE állítás bármelyik ilyen műveletet idézi elő:
- 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
PointnevűSetXYtí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';Note
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
XtulajdonságPointértékét módosítja.UPDATE Cities SET Location.X = 23.5 WHERE Name = 'Anchorage';Ugyanazon a felhasználó által definiált típusoszlop különböző tulajdonságainak módosításához több utasítás kiadásához UPDATE vagy a típus mutató metódusának hívásához szükséges.
FILESTREAM-adatok frissítése
A UPDATE mondatot használhatod egy FILESTREAM mező null értékre, üres értékre vagy viszonylag kis mennyiségű inline adatra történő frissítésére. 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 állítás aritmetikai hibával (túlcsordulás, nullával osztás vagy tartományhiba) találkozik az expresszió értékelése során, a frissítés nem történik meg. 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.
Interoperability
UPDATE Az utasítások a felhasználó által definiált függvények testében csak akkor engedélyezettek, ha a módosítandó tábla egy tábváltozó.
Amikor egy INSTEAD OF trigger definiálva van egy UPDATE tábla elleni műveletekre, akkor a trigger fut az állítás helyett UPDATE . Az SQL Server korábbi verziói csak az AFTER triggereket és UPDATE egyéb adatmódosító állításokat támogatják. A FROM záradék nem lehet olyan állításban meghatározni UPDATE , amely közvetlenül vagy közvetve hivatkozik egy olyan nézetre, amelyen trigger INSTEAD OF van definiálva. További információért a INSTEAD OF kiváltó tényezőiről lásd CREATE TRIGGER (Transact-SQL)
Jelenleg a FROM záradék nem lehet meghatározni a UPDATE Microsoft Fabric-ben található Warehouse nyilatkozatában. Az egytáblás UPDATE állításokat támogatják.
Korlátozások és korlátozások
A FROM záradék nem lehet olyan állításban meghatározni UPDATE , amely közvetlenül vagy közvetve hivatkozik egy olyan nézetre, amelyen trigger INSTEAD OF van definiálva. További információért a INSTEAD OF kiváltó okokról lásd CREATE TRIGGER (Transact-SQL)
Ha egy közös táblázatkifejezés (CTE) van egy UPDATE állítás célpontja, az állításban szereplő CTE-re vonatkozó ö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 kijelentés CTE hivatkozásokkal, amelyek helytelenül egyeznek.
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
Egy UPDATE állítás kizárólagos (X) zárolást szerez bármely módosított soron, és ezeket a zárolásokat a tranzakció befejezéséig tartja. A kijelentés lekérdezési tervétől UPDATE , a módosított sorok számától és a tranzakció izolációs szintjétől függően zárolások az oldal- vagy táblaszinten szerezhetők meg a sorszint helyett. 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
Az UPDATE állítást naplózták; azonban részleges frissítések nagy értékű adattípusokra a . A WRITE záradékokat minimálisan naplózták. További információ: "Nagy értékű adattípusok frissítése" az "Adattípusok" című korábbi szakaszban.
Biztonság
Permissions
UPDATE engedélyekre van szükség a céltáblában.
SELECT jogosultságokra van szükség a tábla frissítéséhez is, ha az UPDATE állítás tartalmaz WHERE záradékot, vagy haSET a klauzula kifejezése oszlopot használ a táblázatban.
UPDATE Az engedélyek alapértelmezetként a sysadmin fix szerver szerep tagjai, a db_owner fix és db_datawriter fix adatbázis szerepek, valamint a tábla tulajdonosa vonatkoznak. 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.
Examples
| Category | Kiemelt szintaxiselemek |
|---|---|
| Alapszintű szintaxis | UPDATE |
| Frissített sorok korlátozása | AHOL * TOP * közös táblázatkifejezéssel * AHOL AZ ÁRAM A |
| 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 | nézetek * táblaváltozók * tábla-aliasok |
| Adatok frissítése más táblákból származó adatok alapján | FROM |
| 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 |
| A nyilatkozat eredményeinek UPDATE rögzítése | OUTPUT záradék |
| Más állításokban való használat UPDATE | Tárolt eljárások * TRY... ELKAP |
Alapszintű szintaxis
Ebben a szakaszban található példák bemutatják az UPDATE állítás alapvető funkcionalitását a minimum szükséges szintaxissal együtt.
A. Egy egyszerű UPDATE állí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
Ebben a szakaszban található példák bemutatják, hogyan lehet korlátozni az állítás által érintett sorok UPDATE 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 Color tábla Production.Product 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ékot használják arra, hogy korlátozzák a módosított sorok számát egy UPDATE állításban. Ha egy TOP (n) záradékot használunk , UPDATEa frissítési műveletet véletlenszerűen kiválasztott 'n' számú sorra hajtják végre. 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 egy kurzor csatlakozáson alapul, csak table_name az állításban megadott UPDATE kurzor változik. 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
Ebben a szakaszban található példák bemutatják, hogyan frissíthetjük az oszlopokat kiszámított értékek, allekérdezések és DEFAULT értékek használatával.
G. Számított érték megadása
Az alábbi példák a kiszámított értékeket használják egy UPDATE állításban. 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;
I. Egy allekérdezés megadása a SET mellékmellékszálban
A következő példa egy allekérdezést használ a SET záradékban annak meghatározására, hogy milyen értéket használnak az oszlop frissítéséhez. Az al lekérdezésnek csak skaláris értéket kell visszaadnia (azaz soronként egyetlen értéket). A példa a SalesYTD tábla SalesPerson 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 értékek DEFAULT alapján
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 view definíció több táblára hivatkozik, azonban az UPDATE állítás sikeres, mert csak az egyik alaptábla oszlopaira hivatkozik. Az UPDATE utasítás meghibásodott volna, ha mindkét tábla oszlopait megadnánk. 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 klauzadban hozzárendelt ScrapReason táblaalias a célobjektumként van megadva UPDATE .
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 állítás használata egy másik táblázatból származó információval
Az alábbi példa a SalesYTD tábla SalesPerson 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. Ez azért van, mert egyetlen UPDATE állítás soha nem frissíti ugyanazt a sort kétszer.
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. Használat UPDATE . WRITE az adatok módosításához egy nvarchar(max) oszlopban
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. Használat UPDATE . WRITE segítségével adatokat hozzáadni és eltávolítani egy nvarchar(max) oszlopból
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 megjelenítik az egyes UPDATE állítások által generált adatmódosításokat.
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. OPENROWSET használata UPDATE egy 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. A FILESTREAM adatok módosítására való használat UPDATE
A következő példa a UPDATE utasítást használja a fájlrendszer fájl adatainak módosítására. 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 Pointnevű SetXY 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 Xtulajdonság Point é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
Ebben a szakaszban található példák bemutatják, hogyan lehet tábla- és lekérdezési tippeket használni arra, hogy ideiglenesen felülírja a lekérdezésoptimalizáló alapértelmezett viselkedését az állítás feldolgozása UPDATE során.
Caution
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 jelzi, hogy az asztalon Production.Product közös zár kerül fel, és a kijelentés végéig UPDATE tartják.
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
A következő példa megadja a lekérdezési tippetOPTIMIZE FOR (@variable) az UPDATE utasításban. 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-%';
A nyilatkozat eredményeinek UPDATE rögzítése
A szakasz példái bemutatják, hogyan lehet a OUTPUT záradékot használni az adott mondalomhoz UPDATE tartozó 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. Használat UPDATE az OUTPUT klauzulával
Az alábbi példa 25 százalékkal frissíti a VacationHours táblában lévő Employee 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 VacationHours oszlopban lévő UPDATE utasítás alkalmazása előtt létező deleted.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
Más állításokban való használat UPDATE
A példák ebben a szakaszban bemutatják, hogyan lehet más állításokban használni UPDATE .
AB. Használat UPDATE tárolt eljárásban
A következő példa egy tárolt eljárásban található UPDATE állítást használ. Az eljárás egy bemeneti paramétert, @NewHoursés egy kimeneti paramétert @RowCount. A @NewHours paraméterértéket a UPDATE táblázat oszlopának frissítéséhez VacationHoursHumanResources.Employeehasználják az utasításban. A @RowCount kimeneti paraméter a helyi változó által érintett sorok számának visszaadására szolgál. A CASE kifejezést a SET klauzulában használják arra, hogy feltételesen meghatározzák az értéket, amely a -re VacationHoursvan beállítva. 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. Használat UPDATE egy TRY... CATCH blokk
A következő példa egy UPDATE TRY... CATCH blokk, hogy kezelje azokat a végrehajtási hibákat, amelyek frissítési művelet során előfordulhatnak.
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)
AD. Egy egyszerű UPDATE állí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 is használhatod egy UPDATE állításban. Az alábbi példa a ListPrice tábla összes sorának Product oszlopában lévő értéket megduplázza.
-- Uses AdventureWorks
UPDATE DimEmployee
SET BaseRate = BaseRate * 2;
AE. UPDATE Az állítás használata egy WHERE klauzulával
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. A címkével UPDATE rendelkező állítás használata
Az alábbi példa a LABEL használatát mutatja az UPDATE utasításhoz.
-- Uses AdventureWorks
UPDATE DimProduct
SET ProductSubcategoryKey = 2
WHERE ProductKey = 313
OPTION (LABEL = N'label1');
AG. Az UPDATE állítás használata egy másik táblázatból származó információval
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