Udostępnij za pomocą


AKTUALIZACJA (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Zmienia istniejące dane w tabeli lub widoku w programie SQL Server. Przykłady można znaleźć w temacie Przykłady.

Transact-SQL konwencje składni

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

Z <common_table_expression>
Określa tymczasowy nazwany zestaw wyników lub widok, znany również jako wspólne wyrażenie tabeli (CTE), zdefiniowany w zakresie instrukcji UPDATE. Zestaw wyników CTE pochodzi z prostego zapytania i jest przywołyny przez instrukcję UPDATE.

Typowe wyrażenia tabeli mogą być również używane z instrukcjami SELECT, INSERT, DELETE i CREATE VIEW. Aby uzyskać więcej informacji, zobacz WITH common_table_expression (Transact-SQL).

TOP (wyrażenie) [ PERCENT ]
Określa liczbę lub procent zaktualizowanych wierszy. wyrażenie może być liczbą lub procentem wierszy.

Wiersze, do których odwołuje się wyrażenie TOP używane z instrukcjami INSERT, UPDATE lub DELETE, nie są rozmieszczane w żadnej kolejności.

Wyrażenia rozdzielania nawiasów w TOP są wymagane w instrukcjach INSERT, UPDATE i DELETE. Aby uzyskać więcej informacji, zobacz TOP (Transact-SQL).

table_alias
Alias określony w klauzuli UPDATE reprezentujący tabelę lub widok, z którego mają zostać zaktualizowane wiersze.

server_name
To nazwa serwera (przy użyciu nazwy serwera połączonego lub funkcji OPENDATASOURCE jako nazwy serwera), w której znajduje się tabela lub widok. Jeśli określono server_name , wymagane są database_name i schema_name .

database_name
To nazwa bazy danych.

schema_name
To nazwa schematu, do którego należy tabela lub widok.

table_or_view_name
To nazwa tabeli lub widoku, z którego mają zostać zaktualizowane wiersze. Widok, do którego odwołuje się table_or_view_name , musi być aktualizowalny i odwoływać się do dokładnie jednej tabeli podstawowej w klauzuli FROM widoku. Aby uzyskać więcej informacji na temat aktualizowalnych widoków, zobacz CREATE VIEW (Transact-SQL).

rowset_function_limited
Jest funkcją OPENQUERY lub OPENROWSET , która podlega możliwościom dostawcy.

Z (<Table_Hint_Limited>)
Określa co najmniej jedną wskazówkę tabeli dozwoloną dla tabeli docelowej. Słowo kluczowe WITH i nawiasy są wymagane. NOLOCK, READUNCOMMITTED, NOEXPAND i kilka innych nie są dozwolone. Aby uzyskać informacje na temat wskazówek dotyczących tabel, zobacz Wskazówki dotyczące tabel (Transact-SQL).

@ table_variable
Określa zmienną tabeli jako źródło tabeli.

SET
Określa listę nazw kolumn lub zmiennych do zaktualizowania.

column_name
To kolumna zawierająca dane, które mają zostać zmienione. column_name musi istnieć w table_or view_name. Nie można zaktualizować kolumn tożsamości.

expression
Jest zmienną, wartością literału, wyrażeniem lub instrukcją podwybierz (ujętą w nawiasy), która zwraca pojedynczą wartość. Wartość zwracana przez wyrażenie zastępuje istniejącą wartość w column_name lub @variable.

Note

W przypadku odwoływania się do typów danych znaków Unicode nchar, nvarchar i ntext wyrażenie powinno być poprzedzone literą wielkiej litery "N". Jeśli parametr "N" nie jest określony, program SQL Server konwertuje ciąg na stronę kodową odpowiadającą domyślnemu sortowaniu bazy danych lub kolumny. Wszystkie znaki nie odnalezione na tej stronie kodowej zostaną utracone.

DEFAULT
Określa, że wartość domyślna zdefiniowana dla kolumny ma zastąpić istniejącą wartość w kolumnie. Można to również użyć do zmiany kolumny na NULL, jeśli kolumna nie ma wartości domyślnej i jest zdefiniowana w celu zezwolenia na wartości null.

{ +=-= | *=%= | | | | /=&= | ^= | |= }
Operator przypisania złożonego:
+= Dodaj i przypisz
-= Odejmij i przypisz
*= Mnożenie i przypisywanie
/= Dzielenie i przypisywanie
%= Modulo i przypisz
&= Bitowe AND i przypisz
^= Bitowe XOR i przypisz
|= Bitowe OR i przypisz

udt_column_name
Jest kolumną typu zdefiniowanego przez użytkownika.

property_name | field_name
Jest właściwością publiczną lub publicznym elementem członkowskim typu zdefiniowanego przez użytkownika.

method_name(argument [ ,... n] )
Jest niestatyczną metodą mutatora publicznego udt_column_name , która przyjmuje co najmniej jeden argument.

. WRITE (wyrażenie,@Przesunięcie,@długość)
Określa, że sekcja wartości column_name ma zostać zmodyfikowana. Wyrażenie zastępuje jednostki @Length rozpoczynające się od @Przesunięciecolumn_name. W tej klauzuli można określić tylko kolumny varchar(max), nvarchar(max)lub varbinary(max). column_name nie może mieć wartości NULL i nie można go zakwalifikować za pomocą nazwy tabeli lub aliasu tabeli.

wyrażenie to wartość skopiowana do column_name. Wyrażenie musi mieć wartość lub być w stanie niejawnie rzutować na typ column_name . Jeśli wyrażenie ma wartość NULL, wartość @Length jest ignorowana, a wartość w column_name jest obcięta przy określonym @Przesunięcie.

@ Przesunięcie to punkt początkowy w wartości przechowywanej w column_name , w której jest zapisywane wyrażenie . @ Przesunięcie jest położeniem bajtów porządkowych opartych na zera, jest bigint i nie może być liczbą ujemną. Jeśli wartość @Offset ma wartość NULL, operacja aktualizacji dołącza wyrażenie na końcu istniejącej wartości column_name i @Length jest ignorowane. Jeśli wartość @Offset jest większa niż długość bajtu wartości column_name , aparat bazy danych zwraca błąd. Jeśli wartość @Offset plus @Length przekracza koniec wartości bazowej w kolumnie, usunięcie następuje do ostatniego znaku wartości.

@ Długość to długość sekcji w kolumnie rozpoczynająca się od @Offset, która jest zastępowana wyrażeniem. @ Długość jest duża i nie może być liczbą ujemną. Jeśli wartość @Length ma wartość NULL, operacja aktualizacji usuwa wszystkie dane z @Offset na końcu wartości column_name .

Aby uzyskać więcej informacji, zobacz Aktualizowanie dużych typów danych wartości.

@ zmienna
Jest zadeklarowaną zmienną ustawioną na wartość zwracaną przez wyrażenie.

Ustaw @wyrażenie = = ustawia zmienną na tę samą wartość co kolumna. Różni się to od@ SET = ,wyrażenia = , które ustawia zmienną na wartość wstępną aktualizacji kolumny.

<OUTPUT_Clause>
Zwraca zaktualizowane dane lub wyrażenia na podstawie ich w ramach operacji UPDATE. Klauzula OUTPUT nie jest obsługiwana w żadnych instrukcjach DML przeznaczonych dla zdalnych tabel ani widoków. Aby uzyskać więcej informacji na temat argumentów i zachowania tej klauzuli, zobacz OUTPUT Clause (Transact-SQL).

OD <table_source>
Określa, że źródło tabeli, widoku lub tabeli pochodnej jest używane do podawania kryteriów operacji aktualizacji. Aby uzyskać więcej informacji, zobacz FROM (Transact-SQL).

Jeśli aktualizowany obiekt jest taki sam jak obiekt w klauzuli FROM i istnieje tylko jedno odwołanie do obiektu w klauzuli FROM, alias obiektu może lub nie może być określony. Jeśli aktualizowany obiekt pojawia się więcej niż raz w klauzuli FROM, jeden i tylko jeden, odwołanie do obiektu nie może określać aliasu tabeli. Wszystkie inne odwołania do obiektu w klauzuli FROM muszą zawierać alias obiektu.

Widok z wyzwalaczem ZAMIAST AKTUALIZACJI nie może być elementem docelowym aktualizacji z klauzulą FROM.

Note

Każde wywołanie metody OPENDATASOURCE, OPENQUERY lub OPENROWSET w klauzuli FROM jest oceniane oddzielnie i niezależnie od dowolnego wywołania tych funkcji używanych jako element docelowy aktualizacji, nawet jeśli do dwóch wywołań są dostarczane identyczne argumenty. W szczególności warunki filtrowania lub sprzężenia zastosowane w wyniku jednego z tych wywołań nie mają wpływu na wyniki drugiego.

WHERE
Określa warunki ograniczające zaktualizowane wiersze. Istnieją dwie formy aktualizacji oparte na tym, która forma klauzuli WHERE jest używana:

  • Przeszukane aktualizacje określają warunek wyszukiwania, aby zakwalifikować wiersze do usunięcia.

  • Aktualizacje rozmieszczone używają klauzuli CURRENT OF, aby określić kursor. Operacja aktualizacji odbywa się w bieżącej pozycji kursora.

<search_condition>
Określa warunek, który ma zostać spełniony, aby wiersze były aktualizowane. Warunek wyszukiwania może być również warunkiem, na którym opiera się sprzężenia. Nie ma limitu liczby predykatów, które można uwzględnić w warunku wyszukiwania. Aby uzyskać więcej informacji na temat predykatów i warunków wyszukiwania, zobacz Warunek wyszukiwania (Transact-SQL).

AKTUALNY
Określa, że aktualizacja jest wykonywana na bieżącej pozycji określonego kursora.

Aktualizacja umieszczona przy użyciu klauzuli WHERE CURRENT OF aktualizuje pojedynczy wiersz w bieżącym położeniu kursora. Może to być dokładniejsze niż przeszukana aktualizacja używająca klauzuli WHERE <search_condition> w celu zakwalifikowania wierszy do zaktualizowania. Przeszukana aktualizacja modyfikuje wiele wierszy, gdy warunek wyszukiwania nie identyfikuje unikatowo jednego wiersza.

GLOBAL
Określa, że cursor_name odnosi się do kursora globalnego.

cursor_name
To nazwa otwartego kursora, z którego ma zostać wykonane pobieranie. Jeśli istnieje zarówno kursor globalny, jak i lokalny o nazwie cursor_name , ten argument odwołuje się do kursora globalnego, jeśli jest określony globalny; w przeciwnym razie odwołuje się do kursora lokalnego. Kursor musi zezwalać na aktualizacje.

cursor_variable_name
To nazwa zmiennej kursora. cursor_variable_name musi odwoływać się do kursora, który zezwala na aktualizacje.

OPCJA (<query_hint> [ ,... n ] )
Określa, że wskazówki optymalizatora są używane do dostosowywania sposobu przetwarzania instrukcji przez aparat bazy danych. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zapytań (Transact-SQL).

Najlepsze rozwiązania

Użyj funkcji , @@ROWCOUNT aby zwrócić liczbę wstawionych wierszy do aplikacji klienckiej. Aby uzyskać więcej informacji, zobacz @@ROWCOUNT (Transact-SQL).

Nazwy zmiennych można używać w instrukcjach UPDATE, aby pokazać stare i nowe wartości, których dotyczy problem, ale powinno być używane tylko wtedy, gdy instrukcja UPDATE wpływa na pojedynczy rekord. Jeśli instrukcja UPDATE ma wpływ na wiele rekordów, aby zwrócić stare i nowe wartości dla każdego rekordu, użyj klauzuli OUTPUT.

Należy zachować ostrożność podczas określania klauzuli FROM, aby podać kryteria operacji aktualizacji. Wyniki instrukcji UPDATE są niezdefiniowane, jeśli instrukcja zawiera klauzulę FROM, która nie jest określona w taki sposób, że tylko jedna wartość jest dostępna dla każdego zaktualizowanego wystąpienia kolumny, czyli jeśli instrukcja UPDATE nie jest deterministyczna. Na przykład w instrukcji UPDATE w poniższym skry skryptzie oba wiersze Table1 spełniające kwalifikacje klauzuli FROM w instrukcji UPDATE, ale nie jest zdefiniowana, który wiersz z Table1 jest używany do aktualizacji wiersza w 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;  

Ten sam problem może wystąpić, gdy FROM klauzule i WHERE CURRENT OF są łączone. W poniższym przykładzie oba wiersze w Table2 instrukcji spełniają kwalifikacje FROM klauzuli UPDATE . Jest on niezdefiniowany, z Table2 którego wiersza należy użyć do zaktualizowania wiersza w pliku Table1.

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  

Obsługa zgodności

Obsługa użycia wskazówek READUNCOMMITTED i NOLOCK w klauzuli FROM, które mają zastosowanie do tabeli docelowej instrukcji UPDATE lub DELETE, zostaną usunięte w przyszłej wersji programu SQL Server. Unikaj używania tych wskazówek w tym kontekście w ramach nowych prac programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie ich używają.

Typy danych

Wszystkie kolumny char i nchar są dopełniane prawym przyciskiem do zdefiniowanej długości.

Jeśli ANSI_PADDING jest ustawiona na wartość OFF, wszystkie spacje końcowe są usuwane z danych wstawionych do kolumn varchar i nvarchar , z wyjątkiem ciągów zawierających tylko spacje. Te ciągi są obcinane do pustego ciągu. Jeśli ANSI_PADDING jest ustawiona na WŁ., spacje końcowe zostaną wstawione. Sterownik ODBC programu Microsoft SQL Server i dostawca OLE DB dla programu SQL Server automatycznie ustawiają ANSI_PADDING WŁĄCZONE dla każdego połączenia. Można to skonfigurować w źródłach danych ODBC lub przez ustawienie atrybutów połączenia lub właściwości. Aby uzyskać więcej informacji, zobacz SET ANSI_PADDING (Transact-SQL).

Aktualizowanie kolumn tekstowych, ntekstowych i obrazów

Modyfikowanie tekstu, ntekstu lub kolumny obrazu za pomocą funkcji UPDATE inicjuje kolumnę, przypisuje do niej prawidłowy wskaźnik tekstowy i przydziela co najmniej jedną stronę danych, chyba że kolumna jest aktualizowana z wartością NULL.

Aby zastąpić lub zmodyfikować duże bloki tekstu, ntekstu lub danych obrazu , użyj instrukcji WRITETEXT lub UPDATETEXT zamiast instrukcji UPDATE.

Jeśli instrukcja UPDATE może zmienić więcej niż jeden wiersz podczas aktualizowania zarówno klucza klastrowania, jak i co najmniej jednej kolumny tekstowej, ntekstu lub obrazu , częściowa aktualizacja tych kolumn jest wykonywana jako pełna zamiana wartości.

Important

Typy danych ntext, text i image zostaną usunięte w przyszłej wersji programu Microsoft SQL Server. Unikaj używania tych typów danych w nowych pracach programistycznych i zaplanuj modyfikowanie aktualnie używanych aplikacji. Zamiast tego użyj nvarchar(max), varchar(max)i varbinary(max).

Aktualizowanie dużych typów danych wartości

Użyj polecenia .KLAUZULA WRITE (expression,Offset,Length@@) umożliwiająca wykonanie częściowej lub pełnej aktualizacji typów danych varchar(max), nvarchar(max)i varbinary(max).

Na przykład częściowa aktualizacja kolumny varchar(max) może usunąć lub zmodyfikować tylko pierwsze 200 bajtów kolumny (200 znaków w przypadku używania znaków ASCII), podczas gdy pełna aktualizacja spowoduje usunięcie lub zmodyfikowanie wszystkich danych w kolumnie. . Aktualizacje zapisu , które wstawiają lub dołączają nowe dane, są rejestrowane minimalnie, jeśli model odzyskiwania bazy danych jest ustawiony na rejestrowane zbiorczo lub proste. Minimalne logowanie nie jest stosowane przy aktualizacji istniejących wartości. Aby uzyskać więcej informacji, zobacz Dziennik transakcji (SQL Server).

Aparat bazy danych konwertuje częściową aktualizację na pełną aktualizację, gdy instrukcja UPDATE powoduje jedną z następujących akcji:

  • Zmienia kolumnę klucza widoku partycjonowanego lub tabeli.
  • Modyfikuje więcej niż jeden wiersz, a także aktualizuje klucz indeksu klastrowanego na niekonstantą wartość.

Nie można użyć . Klauzula WRITE w celu zaktualizowania kolumny NULL lub ustawienia wartości column_name na wartość NULL.

@ Przesunięcie i @Długość są określone w bajtach dla typów danych varbinary i varchar oraz w parach bajtów dla typu danych nvarchar . Aby uzyskać więcej informacji na temat długości typów danych ciągów, zobacz char i varchar (Transact-SQL) oraz nchar i nvarchar (Transact-SQL).

Aby uzyskać najlepszą wydajność, zalecamy wstawianie lub aktualizowanie danych w rozmiarach fragmentów, które są wielokrotnościami 8040 bajtów.

Jeśli kolumna została zmodyfikowana przez element . Klauzula WRITE jest odwoływała się do klauzuli OUTPUT, pełnej wartości kolumny ( przed usunięciem obrazu).column_name lub po wstawieniu obrazu.column_name jest zwracany do określonej kolumny w zmiennej tabeli. Zobacz przykładowy język R, który jest następujący.

Aby osiągnąć tę samą funkcjonalność programu . ZAPISZ z innymi typami danych znaków lub binarnymi, użyj funkcji STUFF (Transact-SQL).

Aktualizowanie kolumn typu zdefiniowanego przez użytkownika

Aktualizowanie wartości w kolumnach typu zdefiniowanych przez użytkownika można wykonać w jeden z następujących sposobów:

  • Podanie wartości w typie danych systemowych programu SQL Server, o ile typ zdefiniowany przez użytkownika obsługuje niejawną lub jawną konwersję z tego typu. W poniższym przykładzie pokazano, jak zaktualizować wartość w kolumnie typu Pointzdefiniowanego przez użytkownika, jawnie konwertując wartość z ciągu.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • Wywołanie metody oznaczonej jako mutator typu zdefiniowanego przez użytkownika w celu przeprowadzenia aktualizacji. Poniższy przykład wywołuje metodę mutatora typu Point o nazwie SetXY. Spowoduje to zaktualizowanie stanu wystąpienia typu.

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

    Note

    Program SQL Server zwraca błąd, jeśli metoda mutatora jest wywoływana na Transact-SQL wartości null lub jeśli nowa wartość wygenerowana przez metodę mutatora ma wartość null.

  • Modyfikowanie wartości zarejestrowanej właściwości lub elementu członkowskiego danych publicznych typu zdefiniowanego przez użytkownika. Wyrażenie dostarczające wartość musi być niejawnie konwertowane na typ właściwości. Poniższy przykład modyfikuje wartość właściwości X typu Pointzdefiniowanego przez użytkownika .

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

    Aby zmodyfikować różne właściwości tej samej kolumny typu zdefiniowanej przez użytkownika, wydaj wiele instrukcji UPDATE lub wywołaj metodę mutatora typu.

Aktualizowanie danych FILESTREAM

Możesz użyć instrukcji UPDATE, aby zaktualizować pole FILESTREAM do wartości null, wartości pustej lub stosunkowo małej ilości danych wbudowanych. Jednak duża ilość danych jest wydajniej przesyłana strumieniowo do pliku przy użyciu interfejsów Win32. Podczas aktualizowania pola FILESTREAM należy zmodyfikować bazowe dane obiektu BLOB w systemie plików. Gdy pole FILESTREAM ma wartość NULL, dane obiektu blOB skojarzone z polem zostaną usunięte. Nie można użyć polecenia . WRITE(), aby wykonać częściowe aktualizacje danych FILESTREAM. Aby uzyskać więcej informacji, zobacz FILESTREAM (SQL Server).

Obsługa błędów

Jeśli aktualizacja wiersza narusza ograniczenie lub regułę, narusza ustawienie NULL dla kolumny lub nowa wartość jest niezgodnym typem danych, instrukcja zostanie anulowana, zostanie zwrócony błąd i nie zostaną zaktualizowane żadne rekordy.

Gdy instrukcja UPDATE napotka błąd arytmetyczny (przepełnienie, dzielenie przez zero lub błąd domeny) podczas obliczania wyrażenia, aktualizacja nie jest wykonywana. Pozostała część partii nie jest wykonywana i zwracany jest komunikat o błędzie.

Jeśli aktualizacja kolumny lub kolumn uczestniczących w indeksie klastrowanym powoduje, że rozmiar indeksu klastrowanego i wiersz przekroczy 8060 bajtów, aktualizacja zakończy się niepowodzeniem i zostanie zwrócony komunikat o błędzie.

Interoperability

Instrukcje UPDATE są dozwolone w treści funkcji zdefiniowanych przez użytkownika tylko wtedy, gdy modyfikowana tabela jest zmienną tabeli.

INSTEAD OF Gdy wyzwalacz jest zdefiniowany w akcjach UPDATE względem tabeli, wyzwalacz jest uruchamiany zamiast instrukcji UPDATE. Starsze wersje programu SQL Server obsługują tylko wyzwalacze AFTER zdefiniowane w instrukcjach UPDATE i innych instrukcjach modyfikacji danych. Klauzula FROM nie może być określona w instrukcji UPDATE, która odwołuje się bezpośrednio lub pośrednio do widoku ze zdefiniowanym wyzwalaczem INSTEAD OF . Aby uzyskać więcej informacji o wyzwalaczach zamiast wyzwalaczy, zobacz CREATE TRIGGER (Transact-SQL).

Obecnie nie można określić klauzuli FROM w instrukcji UPDATE w magazynie w usłudze Microsoft Fabric. Obsługiwane są instrukcje UPDATE z jedną tabelą.

Ograniczenia i ograniczenia

Klauzuli FROM nie można określić w instrukcji UPDATE, która odwołuje się bezpośrednio lub pośrednio do widoku, który ma INSTEAD OF zdefiniowany wyzwalacz. Aby uzyskać więcej informacji na temat INSTEAD OF wyzwalaczy, zobacz CREATE TRIGGER (Transact-SQL).

Gdy wspólne wyrażenie tabeli (CTE) jest celem instrukcji UPDATE, wszystkie odwołania do CTE w instrukcji muszą być zgodne. Jeśli na przykład CTE jest przypisany alias w klauzuli FROM, alias musi być używany dla wszystkich innych odwołań do CTE. Wymagane są jednoznaczne odwołania CTE, ponieważ obiekt CTE nie ma identyfikatora obiektu, którego program SQL Server używa do rozpoznawania niejawnej relacji między obiektem a jego aliasem. Bez tej relacji plan zapytania może generować nieoczekiwane zachowanie sprzężenia i niezamierzone wyniki zapytania. W poniższych przykładach przedstawiono poprawne i nieprawidłowe metody określania CTE, gdy CTE jest obiektem docelowym operacji aktualizacji.

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  

Oto zestaw wyników.

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

Instrukcja UPDATE z odwołaniami CTE, które są niepoprawnie dopasowane.

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  

Oto zestaw wyników.

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

Zachowanie blokujące

Instrukcja UPDATE uzyskuje wyłączną blokadę (X) na wszystkich zmodyfikowanych wierszach i przechowuje te blokady do momentu zakończenia transakcji. W zależności od planu zapytania dla instrukcji UPDATE liczba zmodyfikowanych wierszy i poziom izolacji transakcji blokady mogą być uzyskiwane na poziomie strony lub tabeli, a nie na poziomie wiersza. Aby uniknąć tych blokad wyższego poziomu, rozważ podzielenie instrukcji aktualizacji, które wpływają na tysiące wierszy lub więcej na partie, i upewnij się, że wszystkie warunki sprzężenia i filtrowania są obsługiwane przez indeksy. Aby uzyskać więcej informacji na temat mechaniki blokowania w programie SQL Server, zobacz artykuł Dotyczący blokowania aparatu bazy danych .

Jeśli włączono zoptymalizowane blokowanie, niektóre aspekty blokowania zachowania w celu UPDATE zmiany. Na przykład blokady wyłącznych (X) nie są przechowywane do momentu zakończenia transakcji. Aby uzyskać więcej informacji, zobacz Zoptymalizowane blokowanie.

Zachowanie logowania

Instrukcja UPDATE jest rejestrowana; jednak częściowe aktualizacje dużych typów danych wartości przy użyciu elementu . Klauzula WRITE jest minimalnie rejestrowana. Aby uzyskać więcej informacji, zobacz "Aktualizowanie typów danych o dużej wartości" we wcześniejszej sekcji "Typy danych".

Zabezpieczenia

Permissions

UPDATE uprawnienia są wymagane w tabeli docelowej. SELECT uprawnienia są również wymagane do aktualizowania tabeli, jeśli instrukcja UPDATE zawiera klauzulę WHERE lub jeśli wyrażenie w klauzuli SET używa kolumny w tabeli.

Zaktualizuj uprawnienia domyślne dla członków stałej roli serwera, sysadmin ról stałej db_owner bazy danych i db_datawriter stałych ról bazy danych oraz właściciela tabeli. sysadminCzłonkowie ról , db_owneri db_securityadmin oraz właściciel tabeli mogą przenosić uprawnienia do innych użytkowników.

Examples

Category Polecane elementy składni
Podstawowa składnia UPDATE
Ograniczanie zaktualizowanych wierszy GDZIE * GÓRA * Z wspólnym wyrażeniem tabelowym * GDZIE PRĄD
Ustawianie wartości kolumn obliczone wartości * operatory złożone * wartości domyślne * podzapytania
Określanie obiektów docelowych innych niż tabele standardowe views * zmienne tabeli * aliasy tabeli
Aktualizowanie danych na podstawie danych z innych tabel FROM
Aktualizowanie wierszy w tabeli zdalnej serwer połączony * OPENQUERY * OPENDATASOURCE
Aktualizowanie dużych typów danych obiektów . WRITE * OPENROWSET
Aktualizowanie typów zdefiniowanych przez użytkownika Typy definiowane przez użytkownika
Zastępowanie domyślnego zachowania optymalizatora zapytań przy użyciu wskazówek wskazówki dotyczące tabeli * wskazówki dotyczące zapytań
Przechwytywanie wyników instrukcji UPDATE Klauzula OUTPUT
Używanie funkcji UPDATE w innych instrukcjach Procedury składowane * TRY... ŁAPAĆ

Składnia podstawowa

Przykłady w tej sekcji przedstawiają podstawowe funkcje instrukcji UPDATE przy użyciu minimalnej wymaganej składni.

A. Używanie prostej instrukcji UPDATE

Poniższy przykład aktualizuje jedną kolumnę dla wszystkich wierszy w Person.Address tabeli.

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

B. Aktualizowanie wielu kolumn

Poniższy przykład aktualizuje wartości w kolumnach Bonus, CommissionPcti SalesQuota dla wszystkich wierszy w SalesPerson tabeli.

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

Ograniczanie zaktualizowanych wierszy

Przykłady w tej sekcji przedstawiają sposoby ograniczania liczby wierszy, których dotyczy instrukcja UPDATE.

C. Używanie klauzuli WHERE

W poniższym przykładzie użyto klauzuli WHERE, aby określić wiersze do zaktualizowania. Instrukcja aktualizuje wartość w Color kolumnie Production.Product tabeli dla wszystkich wierszy, które mają istniejącą wartość "Red" w Color kolumnie i mają wartość w Name kolumnie rozpoczynającej się od "Road-250".

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

D. Używanie klauzuli TOP

W poniższych przykładach użyto klauzuli TOP, aby ograniczyć liczbę wierszy zmodyfikowanych w instrukcji UPDATE. Gdy klauzula TOP (n) jest używana z funkcją UPDATE, operacja aktualizacji jest wykonywana na losowym zaznaczeniu liczby wierszy "n". Poniższy przykład aktualizuje kolumnę VacationHours o 25 procent dla 10 losowych wierszy w Employee tabeli.

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

Jeśli musisz użyć funkcji TOP, aby zastosować aktualizacje w znaczącej chronologii, musisz użyć funkcji TOP wraz z instrukcją ORDER BY w instrukcji subselect. Poniższy przykład aktualizuje godziny urlopu 10 pracowników z najwcześniejszymi datami zatrudnienia.

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. Używanie klauzuli WITH common_table_expression

Poniższy przykład aktualizuje PerAssemblyQty wartość wszystkich części i składników, które są używane bezpośrednio lub pośrednio w celu utworzenia elementu ProductAssemblyID 800. Wspólne wyrażenie tabeli zwraca hierarchiczną listę części, które są używane bezpośrednio do kompilowania i części używanych do kompilowania ProductAssemblyID 800 tych składników itd. Modyfikowane są tylko wiersze zwracane przez wspólne wyrażenie tabeli.

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. Używanie klauzuli WHERE CURRENT OF

W poniższym przykładzie użyto klauzuli WHERE CURRENT OF, aby zaktualizować tylko wiersz, na którym znajduje się kursor. Gdy kursor jest oparty na sprzężeniu, modyfikowany jest tylko table_name określony w instrukcji UPDATE. Nie ma to wpływu na inne tabele uczestniczące w kursorze.

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  

Ustawianie wartości kolumn

Przykłady w tej sekcji przedstawiają aktualizowanie kolumn przy użyciu obliczonych wartości, podzapytania i wartości DOMYŚLNYch.

G. Określanie obliczonej wartości

W poniższych przykładach użyto obliczonych wartości w instrukcji UPDATE. W przykładzie ListPrice podwaja się wartość w kolumnie dla wszystkich wierszy w Product tabeli.

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

H. Określanie operatora złożonego

W poniższym przykładzie użyto zmiennej @NewPrice , aby zwiększać cenę wszystkich czerwonych rowerów przez pobranie bieżącej ceny i dodanie do niej wartości 10.

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

W poniższym przykładzie użyto operatora złożonego += w celu dołączenia danych ' - tool malfunction' do istniejącej wartości w kolumnie Name dla wierszy z ScrapReasonID zakresu od 10 do 12.

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

I. Określanie podzapytania w klauzuli SET

W poniższym przykładzie użyto podzapytania w klauzuli SET, aby określić wartość używaną do aktualizowania kolumny. Podzapytywanie musi zwracać tylko wartość skalarną (czyli pojedynczą wartość na wiersz). Przykład modyfikuje kolumnę SalesYTD w SalesPerson tabeli w celu odzwierciedlenia najnowszej sprzedaży zarejestrowanej SalesOrderHeader w tabeli. Podzapytywanie agreguje sprzedaż dla każdego sprzedawcy w instrukcji UPDATE .

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. Aktualizowanie wierszy przy użyciu wartości DOMYŚLNYch

Poniższy przykład ustawia kolumnę CostRate na wartość domyślną CostRate (0,00) dla wszystkich wierszy, które mają wartość większą niż 20.00.

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

Określanie obiektów docelowych innych niż standardowe tabele

Przykłady w tej sekcji pokazują, jak zaktualizować wiersze, określając widok, alias tabeli lub zmienną tabeli.

K. Określanie widoku jako obiektu docelowego

Poniższy przykład aktualizuje wiersze w tabeli, określając widok jako obiekt docelowy. Definicja widoku odwołuje się jednak do wielu tabel, jednak instrukcja UPDATE kończy się powodzeniem, ponieważ odwołuje się do kolumn tylko z jednej z tabel bazowych. Instrukcja UPDATE zakończy się niepowodzeniem, jeśli określono kolumny z obu tabel. Aby uzyskać więcej informacji, zobacz Modyfikowanie danych za pośrednictwem widoku.

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

L. Określanie aliasu tabeli jako obiektu docelowego

Poniższy przykład aktualizuje wiersze w tabeli Production.ScrapReason. Alias tabeli przypisany do ScrapReason w klauzuli FROM jest określony jako obiekt docelowy w klauzuli 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. Określanie zmiennej tabeli jako obiektu docelowego

Poniższy przykład aktualizuje wiersze w zmiennej tabeli.

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  

Aktualizowanie danych na podstawie danych z innych tabel

Przykłady w tej sekcji przedstawiają metody aktualizowania wierszy z jednej tabeli na podstawie informacji w innej tabeli.

N. Używanie instrukcji UPDATE z informacjami z innej tabeli

Poniższy przykład modyfikuje kolumnę SalesYTD w SalesPerson tabeli, aby odzwierciedlić najnowszą sprzedaż zarejestrowaną SalesOrderHeader w tabeli.

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  

W poprzednim przykładzie przyjęto założenie, że tylko jedna sprzedaż jest rejestrowana dla określonego sprzedawcy w określonym dniu i że aktualizacje są aktualne. Jeśli w tym samym dniu można zarejestrować więcej niż jedną sprzedaż dla określonego sprzedawcy, pokazany przykład nie działa poprawnie. Przykład działa bez błędu, ale każda SalesYTD wartość jest aktualizowana tylko przy użyciu jednej sprzedaży, niezależnie od liczby transakcji sprzedaży w danym dniu. Jest to spowodowane tym, że pojedyncza instrukcja UPDATE nigdy nie aktualizuje tego samego wiersza dwa razy.

W sytuacji, w której więcej niż jedna sprzedaż dla określonego sprzedawcy może wystąpić w tym samym dniu, wszystkie sprzedaży dla każdej osoby sprzedaży muszą być agregowane razem w ramach UPDATE instrukcji, jak pokazano w poniższym przykładzie:

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  

Aktualizowanie wierszy w tabeli zdalnej

Przykłady w tej sekcji pokazują, jak zaktualizować wiersze w zdalnej tabeli docelowej przy użyciu serwera połączonego lub funkcji zestawu wierszy w celu odwołania się do tabeli zdalnej.

O. Aktualizowanie danych w tabeli zdalnej przy użyciu serwera połączonego

Poniższy przykład aktualizuje tabelę na serwerze zdalnym. Przykład rozpoczyna się od utworzenia linku do zdalnego źródła danych przy użyciu sp_addlinkedserver. Nazwa serwera MyLinkedServerpołączonego , jest następnie określona jako część nazwy obiektu czteroczęściowego w obiekcie formularza server.catalog.schema.object. Należy pamiętać, że należy określić prawidłową nazwę serwera dla elementu @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. Aktualizowanie danych w tabeli zdalnej przy użyciu funkcji OPENQUERY

Poniższy przykład aktualizuje wiersz w tabeli zdalnej, określając funkcję zestawu wierszy OPENQUERY . W tym przykładzie użyto nazwy serwera połączonego utworzonego w poprzednim przykładzie.

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

Q. Aktualizowanie danych w tabeli zdalnej przy użyciu funkcji OPENDATASOURCE

Poniższy przykład aktualizuje wiersz w tabeli zdalnej, określając funkcję zestawu wierszy OPENDATASOURCE . Określ prawidłową nazwę serwera dla źródła danych przy użyciu formatu server_name lub server_name\instance_name. Może być konieczne skonfigurowanie wystąpienia programu SQL Server dla zapytań rozproszonych ad hoc. Aby uzyskać więcej informacji, zobacz Ad hoc distributed queries Server Configuration Option (Opcja konfiguracji serwera w trybie ad hoc).

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

Aktualizowanie dużych typów danych obiektów

Przykłady w tej sekcji przedstawiają metody aktualizowania wartości w kolumnach zdefiniowanych przy użyciu dużych typów danych obiektów (LOB).

R. Za pomocą polecenia UPDATE z . ZAPISYWANIE w celu modyfikowania danych w kolumnie nvarchar(max)

W poniższym przykładzie użyto metody . Klauzula WRITE w celu zaktualizowania wartości częściowej w DocumentSummarykolumnie nvarchar(max) w Production.Document tabeli. Wyraz components jest zastępowany słowem features , określając wyraz zastępczy, lokalizację początkową (przesunięcie) wyrazu, który ma zostać zastąpiony w istniejących danych, oraz liczbę znaków do zastąpienia (długość). W przykładzie użyto również klauzuli OUTPUT, aby zwrócić wartości przed i po obrazach DocumentSummary kolumny do zmiennej @MyTableVar tabeli.

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. Za pomocą polecenia UPDATE z . ZAPIS w celu dodania i usunięcia danych w kolumnie nvarchar(max)

W poniższych przykładach dodano i usunięto dane z kolumny nvarchar(max), która ma obecnie ustawioną wartość NULL. Ponieważ element . Klauzula WRITE nie może służyć do modyfikowania kolumny NULL. Kolumna jest najpierw wypełniana danymi tymczasowymi. Te dane są następnie zastępowane poprawnymi danymi przy użyciu elementu . KLAUZULA WRITE. Dodatkowe przykłady dołączają dane na końcu wartości kolumny, usuwają (obcięte) dane z kolumny, a na koniec usuwają częściowe dane z kolumny. Instrukcje SELECT wyświetlają modyfikację danych wygenerowaną przez każdą instrukcję UPDATE.

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. Używanie funkcji UPDATE z funkcją OPENROWSET w celu zmodyfikowania kolumny varbinary(max)

Poniższy przykład zastępuje istniejący obraz przechowywany w kolumnie varbinary(max) nowym obrazem. Funkcja OPENROWSET jest używana z opcją BULK w celu załadowania obrazu do kolumny. W tym przykładzie przyjęto założenie, że plik o nazwie Tires.jpg istnieje w określonej ścieżce pliku.

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

U. Modyfikowanie danych FILESTREAM przy użyciu aktualizacji

W poniższym przykładzie użyto instrukcji UPDATE, aby zmodyfikować dane w pliku systemu plików. Nie zalecamy tej metody przesyłania strumieniowego dużych ilości danych do pliku. Użyj odpowiednich interfejsów Win32. Poniższy przykład zastępuje dowolny tekst w rekordzie pliku tekstem Xray 1. Aby uzyskać więcej informacji, zobacz FILESTREAM (SQL Server).

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

Aktualizowanie typów zdefiniowanych przez użytkownika

W poniższych przykładach zmodyfikujemy wartości w kolumnach typu zdefiniowanego przez użytkownika (UDT). Przedstawiono trzy metody. Aby uzyskać więcej informacji na temat kolumn zdefiniowanych przez użytkownika, zobacz CLR User-Defined Types (Typy User-Defined CLR).

V. Używanie typu danych systemowych

Funkcję UDT można zaktualizować, podając wartość w typie danych systemowych programu SQL Server, o ile typ zdefiniowany przez użytkownika obsługuje niejawną lub jawną konwersję z tego typu. W poniższym przykładzie pokazano, jak zaktualizować wartość w kolumnie typu Pointzdefiniowanego przez użytkownika, jawnie konwertując wartość z ciągu.

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

W. Wywoływanie metody

Możesz zaktualizować funkcję UDT, wywołując metodę oznaczoną jako mutator typu zdefiniowanego przez użytkownika w celu przeprowadzenia aktualizacji. Poniższy przykład wywołuje metodę mutatora typu Point o nazwie SetXY. Spowoduje to zaktualizowanie stanu wystąpienia typu.

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

X. Modyfikowanie wartości właściwości lub elementu członkowskiego danych

Można zaktualizować udT, modyfikując wartość zarejestrowanej właściwości lub elementu członkowskiego danych publicznych typu zdefiniowanego przez użytkownika. Wyrażenie dostarczające wartość musi być niejawnie konwertowane na typ właściwości. Poniższy przykład modyfikuje wartość właściwości X typu Pointzdefiniowanego przez użytkownika .

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

Zastępowanie domyślnego zachowania optymalizatora zapytań przy użyciu wskazówek

Przykłady w tej sekcji pokazują, jak używać wskazówek dotyczących tabel i zapytań w celu tymczasowego zastąpienia domyślnego zachowania optymalizatora zapytań podczas przetwarzania instrukcji UPDATE.

Caution

Ponieważ optymalizator zapytań programu SQL Server zazwyczaj wybiera najlepszy plan wykonania zapytania, zalecamy, aby wskazówki były używane tylko jako ostateczność dla doświadczonych deweloperów i administratorów baz danych.

Y. Określanie wskazówki dotyczącej tabeli

W poniższym przykładzie określono wskazówkę tabeli TABLOCK. Ta wskazówka określa, że blokada udostępniona jest wykonywana w tabeli Production.Product i przechowywana do końca instrukcji UPDATE.

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

Z. Określanie wskazówki dotyczącej zapytania

Poniższy przykład określa wskazówkęOPTIMIZE FOR (@variable) zapytania w instrukcji UPDATE. Ta wskazówka nakazuje optymalizatorowi zapytań użycie określonej wartości dla zmiennej lokalnej podczas kompilowania i optymalizowania zapytania. Wartość jest używana tylko podczas optymalizacji zapytań, a nie podczas wykonywania zapytania.

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

Przechwytywanie wyników instrukcji UPDATE

Przykłady w tej sekcji pokazują, jak używać klauzuli OUTPUT do zwracania informacji z lub wyrażeń na podstawie każdego wiersza, którego dotyczy instrukcja UPDATE. Te wyniki można zwrócić do aplikacji przetwarzania do użycia w takich sytuacjach, jak komunikaty potwierdzające, archiwizacja i inne wymagania aplikacji.

AA. Używanie funkcji UPDATE z klauzulą OUTPUT

W poniższym przykładzie kolumna VacationHours w Employee tabeli jest aktualizowana o 25 procent dla pracowników o mniej niż 10 urlopów, a także ustawia wartość w kolumnie ModifiedDate na bieżącą datę. Klauzula OUTPUT zwraca wartość VacationHours , która istnieje przed zastosowaniem UPDATE instrukcji w deleted.VacationHours kolumnie i zaktualizowanej wartości w inserted.VacationHours kolumnie do zmiennej @MyTableVar tabeli.

Dwa SELECT instrukcje są zgodne z instrukcjami, które zwracają wartości w @MyTableVar tabeli i wyniki operacji aktualizacji.Employee Aby uzyskać więcej przykładów przy użyciu klauzuli OUTPUT, zobacz OUTPUT Clause (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  

Używanie funkcji UPDATE w innych instrukcjach

Przykłady w tej sekcji pokazują, jak używać funkcji UPDATE w innych instrukcjach.

AB. Używanie aktualizacji w procedurze składowanej

W poniższym przykładzie użyto instrukcji UPDATE w procedurze składowanej. Procedura przyjmuje jeden parametr wejściowy, @NewHoursi jeden parametr @RowCountwyjściowy . Wartość @NewHours parametru jest używana w instrukcji UPDATE w celu zaktualizowania kolumny VacationHours w tabeli HumanResources.Employee. Parametr @RowCount wyjściowy służy do zwracania liczby wierszy, których dotyczy problem ze zmienną lokalną. Wyrażenie CASE jest używane w klauzuli SET w celu warunkowego określenia wartości ustawionej dla VacationHourselementu . Gdy pracownik jest wypłacany godzinowo (SalariedFlag = 0), VacationHours jest ustawiony na bieżącą liczbę godzin plus wartość określoną w @NewHours; w przeciwnym razie VacationHours jest ustawiona na wartość określoną w @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;  

Prąd zmienny. Korzystanie z aktualizacji w try... Blok CATCH

W poniższym przykładzie użyto instrukcji UPDATE w try... Blok CATCH do obsługi błędów wykonywania, które mogą wystąpić podczas operacji aktualizacji.

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  

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

REKLAMA. Używanie prostej instrukcji UPDATE

W poniższych przykładach pokazano, jak wszystkie wiersze mogą mieć wpływ, gdy klauzula WHERE nie jest używana do określania wiersza (lub wierszy) do zaktualizowania.

Ten przykład aktualizuje wartości w EndDate kolumnach i CurrentFlag dla wszystkich wierszy w DimEmployee tabeli.

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

Wartości obliczone można również użyć w instrukcji UPDATE. Poniższy przykład podwaja wartość w ListPrice kolumnie dla wszystkich wierszy w Product tabeli.

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

AE. Używanie instrukcji UPDATE z klauzulą WHERE

W poniższym przykładzie użyto klauzuli WHERE, aby określić wiersze do zaktualizowania.

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

AF. Używanie instrukcji UPDATE z etykietą

W poniższym przykładzie pokazano użycie etykiety dla instrukcji UPDATE.

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

AG. Używanie instrukcji UPDATE z informacjami z innej tabeli

W tym przykładzie zostanie utworzona tabela do przechowywania całkowitej sprzedaży według roku. Aktualizuje ona łączną sprzedaż dla roku 2004, uruchamiając instrukcję SELECT względem tabeli FactInternetSales.

-- Uses AdventureWorks  
  
CREATE TABLE YearlyTotalSales (  
    YearlySalesAmount MONEY NOT NULL,  
    Year SMALLINT NOT NULL )  
WITH ( DISTRIBUTION = REPLICATE );  
  
INSERT INTO YearlyTotalSales VALUES (0, 2004);  
INSERT INTO YearlyTotalSales VALUES (0, 2005);  
INSERT INTO YearlyTotalSales VALUES (0, 2006);  
  
UPDATE YearlyTotalSales  
SET YearlySalesAmount=  
(SELECT SUM(SalesAmount) FROM FactInternetSales WHERE OrderDateKey >=20040000 AND OrderDateKey < 20050000)  
WHERE Year=2004;  
  
SELECT * FROM YearlyTotalSales;   

ACH. Sprzężenia ANSI na potrzeby instrukcji aktualizacji

W tym przykładzie pokazano, jak zaktualizować dane na podstawie wyniku dołączenia do innej tabeli.

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

Zobacz też

CREATE TABLE (Transact-SQL)
UTWÓRZ TRIGGER (Transact-SQL)
Kursory (Transact-SQL)
USUŃ (Transact-SQL)
WSTAW (Transact-SQL)
Funkcje tekstu i obrazu (Transact-SQL)
Z common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)
Sortowanie i obsługa Unicode
Single-Byte i zestawy znaków wielobajtowych