UPDATE (Transact-SQL)

Zmiany istniejących danych w jednej lub kilku kolumn w tabela lub widoku w SQL Server 2008 R2.Przykłady, zobacz Przykłady.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

[ 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}

Argumenty

  • Z <common_table_expression>
    Określa tymczasowym o nazwie zestaw wyników lub widoku, znane również jako wspólne tabela wyrażenie (CTE), zdefiniowane w zakres instrukcjaUPDATE.CTE zestaw wyników pochodzi od prostych kwerend i odwołują się do instrukcjaUPDATE.Aby uzyskać więcej informacji, zobacz Z common_table_expression (języka Transact-SQL).

  • TOP ( expression**)** [ PERCENT ]
    Określa numer lub procent wierszy, które zostaną zaktualizowane.expressionmoże to być liczba lub procent wierszy.

    Wiersze w GÓRNEJ wyrażenie używane INSERT, UPDATE, korespondencji seryjnej lub DELETE nie są rozmieszczone w dowolnej kolejności.

    Nawiasy rozgraniczającego expression w góry są wymagane w instrukcji INSERT, UPDATE, scalanie i Usuń.Aby uzyskać więcej informacji, zobacz U góry (Transact-SQL).

  • table_alias
    alias określonego w klauzula FROM, reprezentującego tabela lub widok, z której wiersze mają być aktualizowane.

  • server_name
    Jest nazwą serwer połączony , na którym znajduje się tabela lub widok.server_name można określić jako serwer połączony nazwa, lub za pomocą OPENDATASOURCE funkcja.

    Gdy server_name jest określony jako serwer połączony database_name i schema_name są wymagane.Gdy server_name jest określany za pomocą OPENDATASOURCE, database_name i schema_name nie mają zastosowania wszystkie źródła danych i jest z zastrzeżeniem możliwościdostawca OLE DB, który uzyskuje dostęp do obiektu zdalnego. Aby uzyskać więcej informacji, zobacz Kwerend rozproszonych.

  • database_name
    Jest to nazwa bazy danych.

  • schema_name
    Jest to nazwa schematu, do której należy dany tabela lub widoku.

  • table_or view_name
    Jest nazwą tabela lub widoku, z której wiersze mają zostać uaktualnione.Widok odwołuje się table_or_view_name należy aktualizowalna i odniesienia dokładnie jeden tabela bazowa w klauzula FROM widoku.Aby uzyskać więcej informacji na temat widoków aktualizowalna zobacz CREATE VIEW (Transact-SQL).

  • rowset_function_limited
    Jest OTWÓRZKWERENDĘ lub OPENROWSET funkcja.Korzystanie z tych funkcji jest z zastrzeżeniem możliwościdostawca OLE DB, który uzyskuje dostęp do obiektu zdalnego. Aby uzyskać więcej informacji, zobacz Kwerend rozproszonych.

  • Z ( <)Table_Hint_Limited > )
    Określa wskazówki tabela , które są dozwolone dla miejsce docelowe tabela.Słowo kluczowe z i nawiasy są wymagane.NOLOCK i READUNCOMMITTED nie są dozwolone.Aby uzyskać informacje dotyczące tabela wskazówki, zobacz Wskazówki tabel (Transact-SQL).

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

  • ZESTAW
    Określa listę kolumna lub Zmienna nazwy mają być aktualizowane.

  • column_name
    Jest kolumna zawierającą dane, które chcesz zmienić.column_namemusi istnieć w table_or view_name.Nie można zaktualizować kolumny tożsamości.

  • expression
    Jest zmienna, wartość literału, wyrażenielub subselect instrukcja (ujęte w nawiasy) zwracające pojedynczą wartość.Wartość zwracana przez expression zastępuje dotychczasową wartooć wpisaną w column_name lub @variable.

    Ostrzeżenie

    Przy odwoływaniu się do znaków Unicode okreolana nchar, nvarchar, i ntext, "wyrażenie" być poprzedzona z Wielkiej litery 'N'.Jeśli 'N' nie jest określony, SQL Server ciąg jest konwertowany na strona kodowa odpowiada domyślnym sortowanie bazy danych lub kolumna.Wszystkie znaki nie znaleziono w tej strona kodowa zostaną utracone.

  • DOMYŚLNE
    Określa, czy kolumna wartość domyślna jest zastępuje istniejącą wartość w kolumna.To może również zmienić kolumna wartość null, jeśli kolumna ma Brak domyślnej i jest zdefiniowany, aby zezwolić na wartości null .

  • { += | -= | *= | /= | %= | &= | ^= | |= }
    Złożone operatorprzypisania:

    += Dodawanie i przypisywanie

    -= Odjąć i przypisać

    * = Pomnożyć i przypisać

    / = Dzielenie i przypisz

    % = Modulo i przypisać

    &= Iloczynu (AND) i przypisz

    ^ = Bitowe XOR i przypisać

    | = Logiczną lub i przypisz

    Aby uzyskać więcej informacji, zobacz Złożone operatory języka Transact-SQL).

  • udt_column_name
    Jest typ zdefiniowany przez użytkownika kolumna.

  • property_name | field_name
    Jest publicznych właściwość lub publicznych element członkowski danych typ zdefiniowany przez użytkownika.

  • method_name(argument [ ,... n] )
    Jest to mutator publicznego niestatycznego metoda udt_column_name pobierająca jeden lub więcej argumentów.

  • **.**WRITE (expression,@Offset,@Length)
    Określa, że sekcja wartość column_name należy zmodyfikować.expressionzastępuje @Length jednostek począwszy od @Offset z column_name.Tylko kolumny varchar(max), nvarchar(max), lub varbinary(max) można określić przy użyciu tej klauzula.column_namenie może być NULL, a nie kwalifikowaną nazwę tabela lubalias tabela.

    expressionto wartość, która zostanie skopiowana do column_name.expressionnależy oceniać lub można niejawnie można rzutować na column_name typu.Jeśli expression jest zestaw na NULL, @Length jest ignorowany i wartość w column_name jest obcinana w określonym @Offset.

    @Offset jest to punkt wyjścia w wartości column_name jaką expression napisano.@Offsetpozycję porządkową względem zera, jest bigint, i nie może być liczbą ujemną.Jeśli @Offset ma wartość NULL, dołącza operacji aktualizacji expression na końcu istniejącej column_name wartość i @Length jest ignorowana.Jeśli przesunięcie @ jest większa niż długość column_name wartości, Aparat baz danych zwraca błąd.Jeśli @Offset plus @Length przekracza koniec podstawowej wartości w kolumnawystępuje usunięcia do ostatniego znaku wartości.Jeśli @Offset plus LEN (expression) jest większa niż podstawowa zadeklarowany rozmiar, powstaje błąd.

    @Lengthjest długością sekcji w kolumna, począwszy od @Offset, zastępuje się przez expression.@Lengthjest bigint i nie może być liczbą ujemną.Jeśli @Length ma wartość NULL, operacja aktualizacji powoduje usunięcie wszystkich danych z @Offset do końca column_name wartości.

    Aby uzyskać więcej informacji zobacz Spostrzeżenia.

  • @variable
    Jest zadeklarowana zmienna, która jest zestaw na wartość zwracana przez expression.

    Ustaw @variable = column = expression ustawia zmienną taką samą wartość jak kolumna.To różni się od zestawu @variable = column, column = expression, który ustawia zmienną ze wartość kolumna.

  • <OUTPUT_Clause>
    Zwraca zaktualizowane dane lub wyrażeń opartej na nomenklaturze w ramach operacji aktualizacji.Dane wyjściowe klauzula nie jest obsługiwana w sprawozdaniu wszelkie DML tego miejsce docelowe zdalnego tabel lub widoków.Aby uzyskać więcej informacji, zobacz Klauzula wyjściowy (Transact-SQL).

  • Z <table_source>
    Określa, że tabela, widoku lub pochodnych tabela źródło jest używany do podać kryteria dla operacji aktualizacji.Aby uzyskać więcej informacji, zobacz Z języka Transact-SQL).

    Jeśli obiekt, aktualizowany jest taki sam, jak obiekt w klauzula FROM i istnieje tylko jedno odwołanie do obiektu w klauzulaFROM, obiektu alias może lub nie może być określony.Jeśli obiekt aktualizowany jest wyświetlany więcej niż jeden czas w klauzulaFROM, jeden i tylko jeden odwołanie do obiektu nie należy określićalias tabela. Wszystkie odwołania do obiektu w klauzula FROM musi zawierać obiektu alias.

    Widok zawierający wyzwalacza INSTEAD OF UPDATE nie może być miejsce docelowe aktualizacji z klauzulaFROM.

  • W PRZYPADKU GDY
    Określa warunki, które ograniczają wierszy, które są aktualizowane.Istnieją dwie formy Aktualizacja oparta na formę, która jest używana klauzula WHERE:

    • Aktualizacje wyszukiwanych określ warunek wyszukiwania w celu zakwalifikowania wiersze do usunięcia.

    • Umieszczone użycia aktualizacje bieżącego z klauzula określić kursor.Operacja update występuje w bieżącej pozycji kursor.

  • <search_condition>
    Określa warunek muszą zostać spełnione dla wierszy, które mają zostać zaktualizowane.warunek wyszukiwania może być również warunek, na podstawie łączyć .Nie jest ograniczona do liczby predykatów, które mogą być zawarte w warunek wyszukiwania.Aby uzyskać więcej informacji na temat predykatów i warunki wyszukiwania, zobacz Warunek wyszukiwania (Transact-SQL).

  • PRĄD
    Określa wykonywania aktualizacji w bieżącym położeniu określonym kursor.

  • GLOBALNE
    Określa, żecursor_name odnosi się do globalnego kursor.

  • cursor_name
    Jest nazwą otwarte z którego należy dokonać pobrania kursor .Jeśli globalnym i lokalnym kursor o nazwie cursor_name istnieje, ten argument odnosi się do globalnego kursor , jeżeli określono globalne; w przeciwnym wypadku odnosi się kursorlokalny.kursor należy zezwolić na aktualizacje.

  • cursor_variable_name
    Jest nazwą zmiennej kursor .cursor_variable_namenależy odwołać się kursor , która umożliwia aktualizacje.

  • OPTION ( <query_hint> [ ,... n ] )
    Określa, że wskazówek dotyczących optymalizacji są używane do dostosowywania sposobu Aparat baz danych przetwarza instrukcja.Aby uzyskać więcej informacji, zobacz Wskazówki kwerendy (Transact-SQL).

Najważniejsze wskazówki

Nazwy zmiennych mogą być używane w instrukcji UPDATE do wyświetlania wartości stare i nowe wpływ, ale powinno być używane tylko wtedy, gdy aktualizacja instrukcja dotyczy pojedynczego rekordu.Jeśli instrukcja UPDATE wpływa na wiele rekordów, należy używać danych wyjściowych klauzula zwraca stare i nowe wartości dla każdego rekordu.

Należy zachować ostrożność podczas określania klauzula FROM ustanowienie kryteriów dla operacji aktualizacji.Jeśli instrukcja zawiera FROM klauzula , która nie została określona w taki sposób, aby tylko jedna wartość jest dostępna dla każdego wystąpienia kolumna , która jest aktualizowana, oznacza to, że jeśli instrukcja UPDATE nie jest firmy Deterministic Networks, wyniki AKTUALIZUJĄCĄ instrukcja są niezdefiniowane.Może to spowodować niespodziewane wyniki.Na przykład w aktualizacji instrukcja w poniższym skrypcie, oba wiersze w tabeli Tabela1 spełniają kwalifikacji FROM klauzula UPDATE instrukcja; ale jest niezdefiniowana, którego wiersz z Table1 jest używana do aktualizacji wiersza w Table2.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
    DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT 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ć podczas klauzule O FROM i WHERE bieżące są łączone.W poniższym przykładzie, zarówno wiersze w Table2 spełniają kwalifikacje w aktualizacji instrukcja klauzula FROM.Niezdefiniowana, którego wiersz z Table2 jest używany do aktualizowania wiersza w Table1.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
    DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT 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

Ustaw ROWCOUNT nie wpłynie na instrukcji DELETE, INSERT, korespondencji seryjnej i aktualizacji w następnym wydaniu SQL Server.Nie należy USTAWIĆ ROWCOUNT z instrukcji DELETE, INSERT i UPDATE w nowych prac rozwojowych i plan do modyfikowania aplikacji, które obecnie korzystają.Zaleca się także dla instrukcji DELETE, INSERT i UPDATE korzystających aktualnie USTAWIONA ROWCOUNT, przepisz je do GÓRNEJ składnią.

Obsługa użycia wskazówek READUNCOMMITTED i NOLOCK w klauzula FROM, które odnoszą się do miejsce docelowe tabela aktualizacji lub usunięcia instrukcja zostaną usunięte w przyszłej wersja programu SQL Server.Plan do modyfikowania aplikacji, które używają obecnie i unikać te wskazówki w tym kontekście nowych prac rozwojowych.

Typy danych

Wszystkie char i nchar kolumny są wyściełane prawo do zdefiniowanej długości.

Jeśli spowodowałyby jest zestaw na wyłączone, wszystkie spacje końcowe są usuwane z danych wstawione do varchar i nvarchar kolumny, z wyjątkiem ciągów, które zawierają tylko spacje.Te ciągi znaków są obcinane do pusty ciąg.Jeśli zestaw na spowodowałyby spacji końcowych są wstawiane.Microsoft SQL Server ODBC sterownika i dostawcy OLE DB dla SQL Server automatycznie zestaw na spowodowałyby dla każdego połączenia.Można również skonfigurować w źródeł danych ODBC lub ustawianie atrybutów połączenia lub właściwości.Aby uzyskać więcej informacji, zobacz Ustaw spowodowałyby (Transact-SQL).

Aktualizowanie dużych typy danych wartości

Użycie .Zapisu (expression, @Offset, @Length) klauzula do przeprowadzenia aktualizacji pełnych lub częściowych z varchar(max), nvarchar(max), i varbinary(max) typów danych.Na przykład, częściowe aktualizacja z varchar(max) kolumna może zmodyfikować lub usunąć tylko pierwsze 200 znaków kolumna, należy pełną aktualizację czy zmodyfikować lub usunąć wszystkie dane w kolumna.

Aby uzyskać najlepszą wydajność zaleca się, że dane być wstawiany lub aktualizowany w rozmiarach fragment , które są wielokrotności bajtów 8040.

Aparat baz danych Konwertuje aktualizacji częściowej w pełnej aktualizacji aktualizacji instrukcja powoduje, że każda z tych akcji:

  • Zmienia klucz kolumna widoku podzielonym na partycje lub tabela.

  • Modyfikuje więcej niż jeden wiersz, a także aktualizuje klucz nieunikatowy indeks klastrowany na wartość nonconstant.

Nie można używać .ZAPISAĆ klauzula aktualizacji NULL w kolumna lub zestaw wartość column_name na wartość NULL.

@Offseti @Length określona w bajtach dla varbinary i varchar typów danych i w znaki nvarchar typu danych.Odpowiednie przesunięcia są obliczane dla sortowania zestaw znaków dwubajtowych (zestaw znaków dwubajtowych).

Jeśli kolumna zmodyfikowany przez .Zapisu klauzula odwołuje się w danych wyjściowych klauzula, pełna wartość kolumnaalbo przed obrazu w deleted.column_name lub po obrazu w inserted.column_name, jest zwracana do określonej kolumna w tabela zmiennej.

Aby osiągnąć te same funkcje .PISAĆ za pomocą innych znaków lub typów danych binarnych, należy użyć ELEMENTY języka Transact-SQL).

Aktualizowanie danych FILESTREAM

instrukcja UPDATE służy do aktualizacji FILESTREAM pole wartość null , wartość pusta lub stosunkowo niewielką ilość danych wewnętrznych.Jednak dużą ilość danych efektywniej przesyłanej strumieniowo do pliku przy użyciu interfejsów Win32.Podczas aktualizacji FILESTREAM polemożesz zmodyfikować podstawowych danych typu BLOB w systemie plików.FILESTREAM pole jest zestaw na NULL, skreśla się skojarzonych z pole danych typu BLOB.Nie można używać .WRITE() do przeprowadzania aktualizacji częściowej danych FILESTREAM.Aby uzyskać więcej informacji, zobacz Omówienie FILESTREAM.

Aktualizowanie tekst, ntext i image kolumn

Modyfikowanie text, ntext, lub image kolumna z AKTUALIZACJĄ inicjuje kolumna, przypisuje wskaźnik prawidłowy tekst i przydziela danych co najmniej jedną strona, chyba że kolumna jest aktualizowany o wartości NULL.Jeśli instrukcja UPDATE może zmienić więcej niż jeden wiersz, podczas aktualizacji zarówno klastrowanie klucz i jednego lub więcej text, ntext, lub image kolumnach, częściową aktualizację tych kolumn jest wykonywane pełne zastąpienie wartości.

Zastąpienie lub zmodyfikować dużych bloków text, ntext, lub image danych, użyj WRITETEXT lub UPDATETEXT zamiast instrukcjaUPDATE.

Ważna informacjaWażne:

ntext, text, I image typów danych zostaną usunięte w przyszłej wersja programu Microsoft SQL Server.Należy unikać stosowania tych typów danych w nowych prac rozwojowych i plan do modyfikowania aplikacji, które używają obecnie.Użycie nvarchar(max), varchar(max), i varbinary(max) w zamian.Aby uzyskać więcej informacji, zobacz Duża wartość typów danych.

Obsługa błędów

obsługa błędów instrukcja UPDATE można zaimplementować określając instrukcja w TRY…CATCH konstrukcji.Aby uzyskać więcej informacji, zobacz Za pomocą SPRÓBOWAĆ...POŁOWU w języku Transact-SQL.

Jeśli aktualizacja wiersza narusza ograniczenie lub regułę, narusza NULL ustawienie kolumnalub Nowa wartość jest niezgodny typ danych, anulowane instrukcja , zwracany jest błąd i żadne rekordy nie są aktualizowane.

AKTUALIZUJĄCĄ instrukcja napotka błąd arytmetyczny (przepełnienia, dzielenie przez zero lub błąd domena ) w trakcie oceny wyrażenie , aktualizacja nie jest wykonywane.Reszta partia nie jest wykonywana, a następnie zwracany jest komunikat o błędzie.

Jeśli aktualizacja kolumna lub kolumny wchodzące w indeks klastrowany powoduje, że rozmiar wiersza przekracza 8,060 bajtów i indeks klastrowany , aktualizacja nie powiedzie się i zwracany jest komunikat o błędzie.

Współdziałanie

Instrukcje aktualizacji są dozwolone w treści funkcji zdefiniowanych przez użytkownika tylko wtedy, gdy tabela modyfikowany zmiennej tabela .

Po zdefiniowaniu wyzwalacza INSTEAD OF UPDATE działań przeciwko tabelawyzwalacz jest uruchamiany zamiast instrukcjaUPDATE.We wcześniejszych wersjach SQL Server obsługują tylko po zdefiniowaniu wyzwalaczy aktualizacji i innych modyfikacji danych instrukcji.

Ograniczenia i ograniczenia

klauzula FROM nie można określić w aktualizacji instrukcja , która odwołuje się, bezpośrednio lub pośrednio, widok zawierający wyzwalacza INSTEAD OF, zdefiniowane na nim.Aby uzyskać więcej informacji na temat zamiast wyzwalaczy, zobacz CREATE TRIGGER (Transact-SQL).

Ustawienie opcji ustaw ROWCOUNT jest ignorowany dla instrukcji UPDATE przeciwko zdalnego tabele i widoki na podzielonym na partycje lokalnych i zdalnych.

Przy wspólnej tabela wyrażenie (CTE) jest miejsce docelowe AKTUALIZUJĄCĄ instrukcja, muszą być zgodne wszystkie odwołania do CTE w instrukcja .Na przykład jeżeli CTE przydzielono alias w klauzulaFROM, alias musi używane wszystkich odwołań do CTE.Odwołania CTE jednoznaczne są wymagane, ponieważ CTE nie ma Identyfikatora obiektu, który SQL Server używany do rozpoznawania domniemanej relacji między obiektem a jego alias.Bez tej relacji planu kwerend może dać łączyć nieoczekiwane zachowanie i niezamierzone kwerendy wyniki. Następujące przykłady demonstrują poprawne i niepoprawne metod określania CTE, gdy CTE jest obiekt miejsce docelowe 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)

-- UPDATE statement with CTE references that are incorrectly matched.
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 is not 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)

Sposób rejestrowania

instrukcja UPDATE pełni jest zarejestrowany; Jednakże .ZAPISAĆ aktualizacje, które można wstawić lub dołączyć nowe dane są rejestrowane minimalny, jeśli modelu odzyskiwanie bazy danych jest zestaw bulk-logged lub proste.Minimalny rejestrowania nie jest używana, gdy .Zapisu są używane do aktualizowania istniejących wartości.Aby uzyskać więcej informacji, zobacz Operacje, które mogą być rejestrowane minimalny.

Zabezpieczenia

Uprawnienia

Aktualizacja uprawnienia są wymagane wtabela miejsce docelowe. Wybierz uprawnienia są również wymagane dla tabela aktualizowane, jeśli aktualizacja instrukcja zawiera klauzulaWHERE, lub expression w ZESTAWIE klauzula używa kolumna w tabela.

AKTUALIZOWANIE domyślnych uprawnień dla członków sysadmin stała rola serwera db_owner i db_datawriter stałe role bazy danych i tabela właściciela.Członkowie sysadmin, db_owner, i db_securityadmin , role, a właściciel tabela można przenieść uprawnienia do innych użytkowników.

Przykłady

Kategoria

Elementy składni duży

Podstawowa składnia

AKTUALIZACJA

Ograniczanie liczby wierszy, które są aktualizowane

GDZIE • • GÓRNY Z typowych •wyrażenie tabelagdzie CURRENT OF

Ustawienie wartości w kolumnie

obliczone wartości • złożone operatory • domyślne wartości • podkwerendy

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

widoki • tabela zmienne • tabela aliasów

Aktualizowanie danych na podstawie danych z innych tabel

Z

Aktualizacja wierszy w tabeli zdalnej

serwer połączony • OTWÓRZKWERENDĘ • OPENDATASOURCE

Aktualizowanie dużych typy danych obiektu

.• Zapisu OPENROWSET

Aktualizowanie typów zdefiniowanych przez użytkownika

Typy zdefiniowane przez użytkownika

Przesłanianie domyślne zachowanie Optymalizator kwerend przy użyciu wskazówek

• kwerendy wskazówki wskazówektabela

Przechwytywanie wyników instrukcji UPDATE

Dane wyjściowe klauzula

Za pomocą aktualizacji w innych instrukcjach

• Procedury przechowywanej TRY…CATCH

Podstawowa składnia

W tej sekcji przykładach podstawowe funkcje aktualizacji instrukcja przy użyciu minimalnej wymaganej składni.

A.Za pomocą prostej instrukcjaaktualizacji

Poniższy przykład aktualizuje pojedynczej kolumna dla wszystkich wierszy w Person.Address tabela.

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

B.Aktualizowanie wielu kolumn

Poniższy przykład powoduje zaktualizowanie wartości w Bonus, CommissionPct, i SalesQuota kolumny dla wszystkich wierszy w SalesPerson tabela.

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

Ograniczanie liczby wierszy, które są aktualizowane

W tej sekcji przykładach sposobów, które można używać do ograniczania liczby wierszy dotyczy instrukcjaUPDATE.

A.Za pomocą klauzulaWHERE

W poniższym przykładzie użyto klauzula WHERE, aby określić, które wiersze do aktualizacji.instrukcja aktualizuje wartości w Colorkolumna Production.Productwtabela wszystkie wiersze, które mają istniejącą wartość "Czerwony" w Color kolumna i wartość w Name kolumna , która zaczyna się od "Road-250".

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

B.Przy użyciu klauzulaTOP

W następujących przykładach użyto klauzula TOP, aby ograniczyć liczbę wierszy, które są modyfikowane w aktualizacji instrukcja.Gdy GÓRNY (n) jest używana klauzula z AKTUALIZACJĄ, wykonywana jest operacja aktualizacji na losowo wybranych "n' Liczba wierszy.Następujące aktualizacje przykład VacationHours kolumna o 25 procent 10 wierszy losowo w Employee tabela.

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

Korzystania z góry, należy stosować aktualizacje w aspekcie znaczące, należy użyć góry wraz z ORDER BY w instrukcjasubselect.Poniższy przykład aktualizuje urlopy 10 pracowników najwcześniejszej daty 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

C.Za pomocą common_table_expression z klauzula

Następujące aktualizacje przykład PerAssemnblyQty wartość dla wszystkich części i składniki, które są używane bezpośrednio lub pośrednio do tworzenia ProductAssemblyID 800.Wspólne tabela wyrażenie zwraca hierarchiczną listę części, które są używane bezpośrednio do budowania ProductAssemblyID 800 i części, które są używane do tworzenia tych składników i tak dalej.Tylko wierszy zwracanych przez wspólne tabela wyrażenie są modyfikowane.Aby uzyskać więcej informacji na temat typowych wyrażeń tabela cykliczne zobacz Typowe wyrażenia tabeli za pomocą kwerend cyklicznych.

USE AdventureWorks2008R2;
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; 

D.Za pomocą której bieżący z klauzula

W poniższym przykładzie użyto gdzie bieżący z klauzula zaktualizować wiersz, w którym zostanie umieszczony kursor .Gdy kursor jest oparty na łączyć, tylko table_name określona w aktualizacji instrukcja jest modyfikowany.Nie wpływa na inne tabele uczestniczące w kursor .

USE AdventureWorks2008R2;
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

Ustawienie wartości w kolumnie

W tej sekcji przykładach aktualizowania kolumn przy użyciu obliczonych wartości, podkwerend i wartości domyślne.

A.Określanie wartości kalkulowanej

Poniższe przykłady używa AKTUALIZUJĄCĄ instrukcjaobliczonych wartości.Przykład podwaja się wartość w ListPrice kolumna dla wszystkich wierszy w Product tabela.

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

B.Określanie złożonego operator

W poniższym przykładzie użyto zmiennej @NewPrice na zwiększenie ceny wszystkich rowerów czerwone przez pobranie aktualnej ceny i dodanie 10 do niej

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

W poniższym przykładzie użyto mieszanek operator +=, aby dołączyć dane ' - tool malfunction' do istniejącej wartości w kolumna Name dla wierszy, które mają ScrapReasonID między 10 i 12.

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

C.Określanie podzapytanie w klauzulaSET

W poniższym przykładzie użyto podzapytanie w klauzula SET, aby określić wartość, która jest używana do aktualizacji kolumna.podzapytanie musi zwracać tylko wartość wartość skalarna (czyli jedną wartość dla każdego wiersza).Przykład modyfikuje SalesYTD kolumna w SalesPerson tabela , aby odzwierciedlić najnowsze sprzedaży są rejestrowane w SalesOrderHeader tabela.podzapytanie agregatów sprzedaży dla każdego sprzedawcy w UPDATEinstrukcja.

USE AdventureWorks2008R2;
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

D.Aktualizacja wierszy przy użyciu wartości DOMYŚLNYCH

Następujący przykład zestawy CostRate kolumna na wartość domyślną (0,00) wszystkie wiersze, które CostRate na wartość większą niż 20.00.

USE AdventureWorks2008R2;
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 pokazano sposób aktualizowania wierszy przez określenie widoku, tabela aliaslub zmiennej tabela .

A.Określanie widoku jako obiekt miejsce docelowe

Poniższy przykład aktualizuje wiersze w tabela , określając widoku jako obiekt miejsce docelowe .Definicja widoku odwołuje się do wielu tabel, jednak instrukcja UPDATE zakończy się pomyślnie, ponieważ odwołuje się kolumny z tylko jedną z tabel podstawowych.instrukcja UPDATE przestałby działać, jeśli określono kolumn z obu tabel.Aby uzyskać więcej informacji, zobacz Modyfikowanie danych przy użyciu widoku.

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

B.Określaniealias tabelajako obiekt miejsce docelowe

Przykład następujące aktualizacje wierszy w tabela Production.ScrapReason.tabelaalias przypisane do ScrapReason w polu od klauzula jest określony jako obiekt miejsce docelowe w klauzulaUPDATE.

USE AdventureWorks2008R2;
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;

C.Określenie zmiennej tabela jako obiekt miejsce docelowe

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

USE AdventureWorks2008R2;
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

W tej sekcji przykładach metod aktualizowania wierszy z jednej tabela na podstawie informacji zawartych w innej tabela.

A.Informacje z innej tabelaza pomocą instrukcja UPDATE

Poniższy przykład modyfikuje SalesYTD kolumna w SalesPerson tabela , aby odzwierciedlić najnowsze sprzedaży są rejestrowane w SalesOrderHeader tabela.

USE AdventureWorks2008R2;
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

Poprzedni przykład zakłada, że tej sprzedaży tylko jeden jest rejestrowana dla określonego sprzedawcy na określoną data i aktualizacje są aktualne.Jeśli więcej niż jeden sprzedaży dla określonego sprzedawcy mogą być rejestrowane tego samego dnia, przykładu nie działa poprawnie.Przykład uruchamiane bez błędów, ale każdy SalesYTD wartość jest aktualizowana z tylko jednym sprzedaży, niezależnie od tego, ile transakcji sprzedaży faktycznie wystąpił w tym dniu.Wynika to z jednej instrukcja aktualizacji nigdy nie aktualizuje ten sam wiersz dwa razy.

W sytuacji, w których więcej niż jeden sprzedaży dla określonego sprzedawcy mogą wystąpić w tym samym dniu sprzedaży każdego sprzedawcy muszą być zagregowane razem w ramach UPDATE instrukcja, jak pokazano w następującym przykładzie:

USE AdventureWorks2008R2;
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

Aktualizacja wierszy w tabeli zdalnej

Przykłady w tej sekcji przedstawiają sposób aktualizowania wierszy na zdalnym miejsce docelowetabela za pomocą serwer połączony lub zestaw wierszy,funkcja Aby odwołać się za tabela zdalna.

A.Aktualizowanie danych w tabela zdalna przy użyciu serwer połączony

Poniższy przykład aktualizuje tabela na serwerze zdalnym.Przykład rozpoczyna się przez utworzenie łącza do dane zdalne źródło przy użyciu sp_addlinkedserver.Nazwa serwer połączony MyLinkServer, następnie jest określony jako część nazwy czteroczęściowym identyfikatorem obiektu w formularzu server.catalog.schema.object.Należy zauważyć, że należy określić prawidłową nazwa serwera @datasrc.

USE master;
GO
-- Create a link to the remote data source. 
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.

EXEC sp_addlinkedserver @server = N'MyLinkServer',
    @srvproduct = N' ',
    @provider = N'SQLNCLI10', 
    @datasrc = N'<server name>',
    @catalog = N'AdventureWorks2008R2';
GO
USE AdventureWorks2008R2;
GO
-- Specify the remote data source using a four-part name 
-- in the form linked_server.catalog.schema.object.

UPDATE MyLinkServer.AdventureWorks.HumanResources.Department
SET GroupName = N'Public Relations'
WHERE DepartmentID = 4;

B.Aktualizowanie danych w tabela zdalna za pomocą funkcjaOtwórzKwerendę (OpenQuery)

Poniższy przykład aktualizacji wiersza w tabela zdalna przez określenie OTWÓRZKWERENDĘ zestaw wierszy funkcja.Nazwa serwer połączony , utworzonego w poprzednim przykładzie jest używany w tym przykładzie.

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

C.Aktualizowanie danych w tabela zdalna za pomocą funkcjaOPENDATASOURCE

Poniższy przykład wstawia wiersz do tabela zdalna przez określenie OPENDATASOURCE zestaw wierszy funkcja.Określ prawidłową nazwa serwera źródło danych przy użyciu formatu nazwa_serwera lub server_name\instance_name.Może być konieczne skonfigurowanie wystąpienie SQL Server dla kwerend Ad Hoc Distributed.Aby uzyskać więcej informacji, zobacz kwerendy rozproszone ad hoc, opcja.

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

Aktualizowanie dużych typy danych obiektu

W tej sekcji przykładach metod aktualizowania wartości w kolumnach, które zostały zdefiniowane za pomocą dużego obiektu (LOB), typy danych.

A.Za pomocą aktualizacji za pomocą.ZAPIS do modyfikowania danych w nvarchar(max) kolumna

W poniższym przykładzie użyto .Zapisu klauzula aktualizacji częściowej wartości w DocumentSummary, nvarchar(max) kolumna w Production.Document tabela.Wyraz components zastępuje się wyrazem features przez określenie wyraz zamiany lokalizacja początkowa (przesunięcie) program word zastępuje istniejące dane i liczba znaków jest zastępowany (długość).W przykładzie użyto również dane wyjściowe klauzula zwrócić przed i po obrazy DocumentSummary kolumna , aby @MyTableVarzmiennejtabela .

USE AdventureWorks2008R2;
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

B.Za pomocą aktualizacji za pomocą.ZAPIS do dodawania i usuwania danych w nvarchar(max) kolumna

Poniższe przykłady dodawania i usuwania danych z nvarchar(max) kolumna , która ma wartość aktualnie zestaw na NULL.Ponieważ .Zapisu klauzula nie można zmodyfikować wartości NULL kolumna, kolumna jest najpierw wypełniona dane tymczasowe.Dane te jest następnie zastępowany poprawne dane przy użyciu.Napisz klauzula.Dodatkowe przykłady dołączania danych do końca wartość kolumna , usunąć (obcięciu) danych z kolumna i, ostatecznie, usunąć częściowe dane z kolumna.Instrukcje SELECT wyświetla generowane przy każdej aktualizacji instrukcjamodyfikacji danych.

USE AdventureWorks2008R2;
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

C.Za pomocą aktualizacji za pomocą opcji OPENROWSET zmodyfikować varbinary(max) kolumna

Poniższy przykład zastępuje istniejący obraz przechowywany w varbinary(max) kolumna z nowego obrazu.OPENROWSETfunkcja jest używana z opcją luzem do ładowania obrazu do kolumna. W tym przykładzie założono, że plik o nazwie Tires.jpg istnieje w określonej ścieżka.

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

D.Aby zmodyfikować dane FILESTREAM przy użyciu aktualizacji

W poniższym przykładzie użyto instrukcja UPDATE, aby zmodyfikować dane w pliku systemowego pliku.Nie zaleca tej metoda do przesyłania strumieniowego dużych ilości danych w pliku.Za pomocą odpowiednich interfejsów Win32.Poniższy przykład zastępuje dowolny tekst w rekordzie pliku z tekstem Xray 1.Aby uzyskać więcej informacji, zobacz Omówienie FILESTREAM.

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

Aktualizowanie typów zdefiniowanych przez użytkownika

Poniższe przykłady modyfikować wartości w kolumnach zdefiniowany przez użytkownika typ CLR (UDT).Wykazane są trzy metody.Aby uzyskać więcej informacji na temat kolumn zdefiniowanych przez użytkownika, zobacz CLR typów zdefiniowanych przez użytkownika.

A.Używany typ danych systemowych

UDT można zaktualizować, podając wartość w SQL Server Typ danych systemu, tak długo, jak typ zdefiniowany przez użytkownika obsługuje bezpośrednia lub pośrednia konwersja z tego typu.Poniższy przykład ilustruje sposób aktualizacji wartości w kolumna typ zdefiniowany przez użytkownika Point, konwertując jawnie z ciąg.

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

B.Wywoływanie metoda

Aby zaktualizować UDT , wywoływanie metoda, oznaczony jako mutator, typ zdefiniowany przez użytkownika, aby wykonać aktualizację.Poniższy przykład wywołuje metoda typu mutator Point o nazwie SetXY.Aktualizuje stan wystąpienie typu.

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

C.Modyfikowanie wartości właściwość lub element członkowski danych

Modyfikując wartości zarejestrowanych właściwość lub publicznych element członkowski danych typ zdefiniowany przez użytkownika, można zaktualizować UDT .wyrażenie dostarczające wartości musi być jawnie konwertowany na typ właściwość.Poniższy przykład modyfikuje wartość właściwość X typ zdefiniowany przez użytkownika Point.

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

Przesłanianie domyślne zachowanie Optymalizator kwerend przy użyciu wskazówek

Przykłady w tej sekcji przedstawiają sposób zastosowania wskazówek tabela i kwerend, aby tymczasowo zastąpić domyślne zachowanie optymalizator kwerendy podczas przetwarzania instrukcjaUPDATE.

PrzestrogaPrzestroga

Ponieważ SQL Server optymalizator kwerendy zazwyczaj wybiera najlepszego planu wykonania kwerendy, firma Microsoft zaleca wskazówki był używany tylko w ostateczności przez doświadczonych programistów i administratorów baz danych.

A.Określanie Wskazówka tabela

W następującym przykładzie określono tabela wskazówki TABLOCK.Wskazówka ta określa podjęcia udostępnionego blokada w tabela Production.Product i przechowywane aż do końca instrukcjaUPDATE.

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

B.Określanie wskazówkę dotyczącą kwerendy

W następującym przykładzie określono wskazówkę dotyczącą kwerendyOPTIMIZE FOR (@variable) w instrukcjaUPDATE.Wskazówka ta powoduje, że optymalizator kwerendy do użytku określonej wartości zmiennej lokalnej, gdy kwerenda jest skompilowany i zoptymalizowany.Wartość jest używana tylko podczas optymalizacji kwerendy, a nie podczas wykonywania kwerendy.

USE AdventureWorks2008R2;
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 przedstawiają sposób zastosowania Dane wyjściowe klauzuli zwracają informacje z lub wyrażenia w oparciu o każdy wiersz dotyczy aktualizacji instrukcja.Te wyniki mogą być zwracane do aplikacji przetwarzającej do użycia w takich elementów, jak komunikatów potwierdzających, archiwizowanie i innych takich wymagań aplikacji.

A.Za pomocą aktualizacji z WYJŚCIOWEGO klauzula

Poniższy przykład aktualizuje kolumna VacationHours w Employee tabela o 25 procent pierwszych 10 wierszy, a także ustawia wartość w kolumna ModifiedDate do bieżącej data.OUTPUTklauzula zwraca wartość VacationHours występuje przed zastosowaniem UPDATEinstrukcja w deleted.VacationHourskolumna i zaktualizowane wartości w inserted.VacationHourskolumna , aby @MyTableVarzmiennejtabela .

Dwa SELECT Wykonaj instrukcje, które zwracają wartości w @MyTableVar i wyniki operacji aktualizacji w Employee tabela.Więcej przykładów przy użyciu danych wyjściowych klauzulazobacz Klauzula wyjściowy (Transact-SQL).

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

Za pomocą aktualizacji w innych instrukcjach

Przykłady w tej sekcji przedstawiają sposób zastosowania aktualizacji w innych instrukcjach.

A.Za pomocą aktualizacji w procedura składowana

W poniższym przykładzie użyto aktualizacji instrukcja w procedura składowana.Procedura przyjmuje jeden parametr wejściowy, @NewHours i jeden parametr wyjściowy @RowCount.@NewHours W aktualizacji instrukcja , aby zaktualizować zawartość kolumnazostanie użyta wartość parametru VacationHours w tabela HumanResources.Employee.@RowCount Parametr wyjściowy jest używane do zwracania liczby wierszy wpływa do zmiennej lokalnej.SPRAWY wyrażenie jest używany w klauzula SET warunkowo ustalenie wartości zestaw dla VacationHours.Gdy pracownik jest wypłacana za każdą godzinę (SalariedFlag = 0), VacationHours jest zestaw na bieżącą liczbę godzin plus wartość określona w @NewHours; w przeciwnym razie VacationHours jest zestaw na wartość określona w @NewHours.

USE AdventureWorks2008R2;
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;

B.Za pomocą aktualizacji w TRY…Blok CATCH

W poniższym przykładzie użyto AKTUALIZUJĄCĄ instrukcja w TRY…blok CATCH do obsługi błędów wykonania, które mogą występować podczas operacji update.Aby uzyskać więcej informacji, zobacz Za pomocą SPRÓBOWAĆ...POŁOWU w języku Transact-SQL.

USE AdventureWorks2008R2;
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