UPDATE języka Transact-SQL)

Zmień istniejące dane w tabela lub widoku.

Topic link iconKonwencje składni języka Transact-SQL

[ WITH <common_table_expression> [...n] ]
UPDATE 
    [ TOP ( expression ) [ PERCENT ] ] 
    { <object> | rowset_function_limited 
     [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
    }
       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

  • WITH common_table_expression < >
    Określa tymczasowym o nazwie zestaw wyników lub widok, znane również jako wspólne tabela wyrażenie (CTE) zdefiniowanych w ramach zakres instrukcja UPDATE.Zestaw wyników CTE jest określany na podstawie kwerendy prostej i odwołują się do instrukcja UPDATE.Aby uzyskać więcej informacji zobaczWITH common_table_expression (Transact-SQL).

  • TOP ( expression**)** [ PERCENT ]
    Specifies the number or percent of rows that will be updated.expression can be either a number or a percent of the rows.

    Wiersze, do którego odwołuje się wyrażenie TOP używane INSERT, UPDATE, korespondencji SERYJNEJ lub DELETE nie są rozmieszczone w dowolnej kolejności.

    Nawiasy ograniczająca expression w TOP są wymagane w instrukcji INSERT, UPDATE, korespondencji SERYJNEJ i DELETE. Aby uzyskać więcej informacji zobaczTOP (Transact-SQL).

  • server_name
    Is the name of the linked server on which the table or view is located.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

    Kiedy server_name jest określony jako serwer połączony database_name i schema_name są wymagane. Kiedy server_name jest określany za pomocą OPENDATASOURCE, database_name i schema_name nie może być stosowane do wszystkich źródeł danych i podlega funkcje dostawca OLE DB, który uzyskuje dostęp do obiektu zdalnego. Aby uzyskać więcej informacji zobaczDistributed Queries.

  • database_name
    Jest nazwą bazy danych.

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

  • table_or view_name
    To nazwa tabela lub widoku, z którego mają być aktualizowane wiersze.

    Zmienna tabela, w swoim zakresie, można użyć jako urządzenie źródłowe tabela za pomocą instrukcja UPDATE.

    W widoku, do którego odnosi się table_or_view_name musi być możliwa i połącz dokładnie jednej tabela bazowa w klauzula FROM widoku. Aby uzyskać więcej informacji na temat widoków można aktualizować zobacz CREATE VIEW języka Transact-SQL).

  • rowset_function_limited
    Czy albo OPENQUERY or OPENROWSET funkcja.Korzystanie z tych funkcji podlega funkcje dostawca OLE DB, który uzyskuje dostęp do obiektu zdalnego.Aby uzyskać więcej informacji zobaczDistributed Queries.

  • WITH ( <Table_Hint_Limited> )
    Określa wskazówki tabela, które są dozwolone dla tabela miejsce docelowe.Słowo kluczowe WITH i nawiasy są wymagane.NOLOCK i READUNCOMMITTED nie są dozwolone.Aby uzyskać informacje na temat wskazówek dotyczących tabela zobacz Wskazówki do tabela (języka Transact-SQL).

  • ZESTAW
    Określa listę kolumna lub nazwy zmiennych, które mają być aktualizowane.

  • column_name
    Is a column that contains the data to be changed.column_name must exist in table_or view_name.Nie można zaktualizować kolumny identyfikacji.

  • expression
    Czy zmienna, wartość literału, wyrażenie lub instrukcja subselect (ujęty w nawiasy), która zwraca jedną wartość.Wartość zwracana przez expression zastępuje istniejącą wartość column_name lub @variable.

    Uwaga

    Przy odwoływaniu się do typy danych standardu Unicode znaku nchar, nvarchar, a ntext, „ wyrażenie „ należy poprzedzać prefiksem w Wielka litera n ". Jeśli 'N' nie zostanie określona, SQL Server Konwertuje ciąg na strona kodowa, która odpowiada domyślnym sortowaniem bazy danych lub kolumna. Tracone są wszystkie znaki, nie można odnaleźć tej strona kodowa.

  • WARTOŚĆ DOMYŚLNA
    Określa, że wartość domyślna zdefiniowana kolumna ma zastąpić istniejącą wartość kolumna.To może być również zmienić w kolumnie wartość NULL, gdy kolumna ma Brak domyślnej i definiuje się, aby zezwolić na wartości null.

  • { += | -= | *= | /= | %= | &= | ^= | |= }
    Operator przypisania złożonego:

    += Dodawanie i przypisywanie

    -= odejmować i przypisać

    * = Należy pomnożyć i przypisać

    / = Dzielenie i przypisywanie

    % = Modulo i przypisać

    &= I bitowe i przypisywanie

    ^ = Bitowe XOR i przypisać

    | = OR bitowe i przypisywanie

  • udt_column_name
    Jest kolumną typ zdefiniowany przez użytkownika.

  • property_name | field_name
    Jest to właściwość publicznej lub członkiem publiczne dane typ zdefiniowany przez użytkownika.

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

  • .WRITE (expression,@Offset,@Length**)**
    Specifies that a section of the value of column_name is to be modified.expression replaces @Length units starting from @Offset of column_name.Only columns of varchar(max), nvarchar(max), or varbinary(max) can be specified with this clause.column_name cannot be NULL and cannot be qualified with a table name or table alias.

    expression is the value that is copied to column_name.expression must evaluate to or be able to be implicitly cast to the column_name type.Jeśli expression jest zestaw wartość null, @Length jest ignorowana, a wartość column_name zostanie obcięta do liczby całkowitej w określonym @Offset.

    @Offset is the starting point in the value of column_name at which expression is written.@Offset is a zero-based ordinal position, is bigint, and cannot be a negative number.Jeśli @Offset ma wartość NULL, dołącza operacji aktualizacji expression na końcu istniejącego pliku column_name wartość i @Length jest ignorowana. Jeśli przesunięcie @ jest większa niż długość column_name wartość, Database Engine Zwraca błąd. Jeśli @Offset plus @Length przekracza koniec wartości kolumna podstawowej usunięcia występuje aż do ostatniego znaku wartości. Jeśli @Offset plus LEN)expression) jest większa niż podstawowa zadeklarowany rozmiar, błąd zostanie zaokrąglona.

    @Length is the length of the section in the column, starting from @Offset, that is replaced by expression.@Length is bigint and cannot be a negative number.Jeśli @Length ma wartość NULL, operacja aktualizacji powoduje usunięcie wszystkich danych z @Offset na końcu column_name wartość.

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

  • **@**variable
    To deklarowana zmienna jest ustawiona na wartość zwracana przez expression.

    ZESTAW **@**variable = column = expression ustawia zmienną tę samą wartość co dla kolumna. To różni się od zestaw **@**variable = column, column = expression, który ustawia zmienną pre-update wartości kolumna.

  • <OUTPUT_Clause>
    Zwraca aktualizowane dane i wyrażenia oparte na nim w ramach operacji UPDATE.Klauzula wyjście nie jest obsługiwana w każdej instrukcji DML zdalnego tabel lub widoków.Aby uzyskać więcej informacji zobaczKlauzula OUTPUT (języka Transact-SQL).

  • FROM table_source < >
    Określa, że tabela, widoku lub tabela pochodnej źródłowego jest używany do podać kryteria dla operacji aktualizacji.Aby uzyskać więcej informacji zobaczFROM (Transact-SQL).

    Jeśli obiekt, aktualizowany jest taka sama, jak obiekt w klauzula FROM, jeśli ma tylko jedno odwołanie do obiektu w klauzula FROM, alias obiektu może lub nie może być określony.Jeśli obiekt nie jest aktualizowane pojawia się więcej niż jeden raz w klauzula FROM: jeden i tylko raz, odwołanie do obiektu nie może określać alias tabela.Wszystkie inne odwołania do obiektu w klauzula FROM muszą zawierać alias obiektu.

    Widok z wyzwalacz Z INSTEAD UPDATE nie może być celem aktualizacji z klauzula FROM.

  • GDZIE
    Określa warunki, które ograniczają wierszy, które są aktualizowane.Istnieją dwa rodzaje aktualizacji, zależnie od formę, która jest używana klauzula WHERE:

    • Aktualizacje wyszukiwanych określony warunek wyszukiwania do kwalifikowania wierszy do usunięcia.

    • Ustawione aktualizacje użycia klauzula CURRENT OF, aby określić kursor.Operacja aktualizacji występuje w bieżącej pozycji kursor.

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

  • PRĄD
    Określa, czy aktualizacja jest wykonywana w bieżącej pozycji kursor określony.

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

  • cursor_name
    To nazwa kursor otwarte, z którego zostanie wykonane pobrania.Jeśli globalnym i lokalnym kursor o nazwie cursor_name istnieje, ten argument odnosi się do globalnego kursor Jeśli GLOBAL jest określona; w przeciwnym razie, odwołuje się do lokalnego kursora. Kursor musi zezwolić na aktualizacje.

  • cursor_variable_name
    Is the name of a cursor variable.cursor_variable_name must reference a cursor that allows updates.

  • OPTION ( <query_hint> [ ,... n ] )
    Określa, że wskazówek dotyczących optymalizacji są używane, aby dostosować sposób Database Engine przetwarza instrukcja. Aby uzyskać więcej informacji zobaczQuery Hints (Transact-SQL).

Remarks

Instrukcja UPDATE jest w pełni rejestrowane; jednak częściowe aktualizuje dużą wartość typy danych przy użyciu . WRITE klauzula minimalny zestaw są rejestrowane.Aby uzyskać więcej informacji zobacz „ Aktualizacja duże wartości typów danych"znajdujący się.

Instrukcji UPDATE w treści funkcji zdefiniowanych przez użytkownika są dozwolone tylko wtedy, gdy w tabeli, które należy zmodyfikować zmienną Tabela.

Jeśli aktualizacja wiersza narusza ograniczenie lub reguły, narusza NULL ustawienie lub nową wartość kolumna jest typem danych niezgodne, w instrukcja jest anulowane, zwracany jest błąd i żadne rekordy nie są aktualizowane.

Jeśli instrukcja UPDATE napotka błąd arytmetyczny (przepełnienia, dzielenie przez zero lub błąd domena) podczas oceny wyrażenie, aktualizacja nie jest wykonywane.Pozostała część partia jest pomijany i zwracany jest komunikat o błędzie.

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

Wszystkie char i nchar kolumny są wypełniane prawo do zdefiniowanej długości.

Ustawienie opcji zestaw ROWCOUNT jest ignorowana dla instrukcji UPDATE przed zdalnego tabele i widoki na podzielonym na partycje lokalnych i zdalnych.

Jeśli jest ANSI_PADDING zestaw do wyłączona, wszystkie spacje końcowe są usuwane z wstawione do danych varchar i nvarchar kolumny, z wyjątkiem ciągów, które zawiera tylko spacje. Następujące ciągi znaków są obcinane na pusty ciąg.Jeśli jest ANSI_PADDING zestaw on, są wstawiane spacji końcowych.Sterownik ODBC Microsoft SQL Server i OLE DB dostawca for SQL Server automatycznie ANSI_PADDING zestaw ON dla każdego połączenia.Można również skonfigurować źródła danych ODBC lub ustawianie atrybutów połączenia lub właściwości.Aby uzyskać więcej informacji zobaczSET ANSI_PADDING (Transact-SQL).

aktualizacja pozycjonowana przy użyciu klauzula WHERE CURRENT OF aktualizuje pojedynczego wiersza w bieżącej pozycji kursor.Może to być bardziej dokładny od wyszukiwanych aktualizacji, która używa WHERE <search_condition> Klauzula, aby móc skorzystać z wierszy, które mają być aktualizowane. Przeszukiwany aktualizacja modyfikuje wiele wierszy, gdy warunek wyszukiwania nie jednoznacznie identyfikuje jeden wiersz.

Przy użyciu FROM UPDATE klauzula

Jeśli instrukcja zawiera klauzulę FROM, nie jest określony w taki sposób, że tylko jedna wartość jest dostępna dla każdej kolumna wystąpienie, które są aktualizowane, jeśli instrukcja UPDATE nie jest deterministyczny, wyniki instrukcji UPDATE są niezdefiniowane.Na przykład w UPDATE Instrukcja w poniższym skrypcie oba wiersze Table1 spełniają kwalifikacji FROM w klauzula UPDATE Instrukcja; jednak jest niezdefiniowana, które wierszy z Table1 Służy do aktualizowania w wierszu Table2.

USE AdventureWorks;
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 PRIMARY KEY 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ć, jeśli są łączone z klauzul FROM i WHERE.W poniższym przykładzie, zarówno wiersze Table2 spełniają kwalifikacji FROM w klauzula UPDATE Instrukcja. Jest niezdefiniowana, który wiersz z Table2 nie ma być używany do aktualizowania w wierszu Table1.

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

Aktualizowanie kolumn typ zdefiniowany przez użytkownika

Aktualizowanie wartości w kolumnach typ zdefiniowany przez użytkownika mogą być realizowane w jednym z następujących sposobów:

  • Podanie wartości w SQL Server Typ danych systemu, tak długo, jak typ zdefiniowany przez użytkownika obsługuje bezpośrednia lub pośrednia konwersję z tego typu. W poniższym przykładzie przedstawiono sposób aktualizacji wartości kolumna typ zdefiniowany przez użytkownika Point, konwertując bezpośrednio z ciąg.

    UPDATE Cities
    SET Location = CONVERT(Point, '12.3:46.2')
    WHERE Name = 'Anchorage';
    
  • Wywoływanie metoda, oznaczone jako mutator, z typ zdefiniowany przez użytkownika w celu wykonania aktualizacji.W poniższym przykładzie wywoła metoda mutator typu Point o nazwie SetXY. Spowoduje to aktualizację stanu wystąpienie tego typu.

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

    Uwaga

    SQL Server Zwraca błąd, gdy wywoływana jest metoda mutator na Transact-SQL wartość null, lub nową wartość wyprodukowane przez metodę mutator jest null.

  • Modyfikowanie wartości właściwość zarejestrowane lub członkiem publiczne dane typ zdefiniowany przez użytkownika.Dostarczanie wartością wyrażenie musi być niejawnie podlegające konwersji na typ właściwość.W poniższym przykładzie Modyfikuje wartość właściwość X Typ zdefiniowany przez użytkownika Point.

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

    Aby zmienić inne właściwości tej samej kolumna typ zdefiniowany przez użytkownika, wystawiać wielu instrukcji UPDATE lub wywołania metoda mutator tego typu.

Aktualizowanie typów danych duża wartość

Use the .WRITE (expression, @Offset**,**@Length) clause to perform a partial or full update of varchar(max), nvarchar(max), and varbinary(max) data types.Na przykład częściowego aktualizacji z varchar(max) kolumna może zmodyfikować lub usunąć tylko pierwsze 200 znaków kolumny, należy pełną aktualizację czy zmodyfikować lub usunąć wszystkie dane w kolumnie. . WRITE, aktualizacje, które można wstawić lub dołączyć nowe dane mogą być rejestrowane minimalny zestaw Jeśli rejestrowane zbiorczego lub prostego modelu odzyskiwanie bazy danych jest ustawiony.Minimalna rejestrowania nie jest używane, jeśli istniejące wartości zostały zaktualizowane.Aby uzyskać więcej informacji zobaczOperations That Can Be Minimally Logged.

The Database Engine converts a partial update to a full update when the UPDATE instrukcja causes either of these actions:

  • Zmienia kolumna klucz widoku podzielonym na partycje lub w tabela.

  • Modyfikuje więcej niż jeden wiersz i aktualizuje również klucz nieunikatowy indeks klastrowany nonconstant wartości.

Nie można używać . Klauzula zaktualizować kolumnie wartość NULL lub ustaw wartość zapisu column_name wartość null.

@Offset i @Length określono dla wyrażony w bajtach varbinary i varchar typy danych i znaki nvarchar Typ danych. Przesunięcia odpowiednie są obliczane na znaków zestaw zestaw znaków dwubajtowych (zestaw znaków dwubajtowych) sortowania.

Aby uzyskać najlepszą wydajność zaleca się wstawione lub zaktualizowane w rozmiary segment wielokrotności 8040 bajtów danych.

Jeśli kolumna zmodyfikowany przez . ZAPISU, do którego klauzula odwołuje się klauzulę wyjście pełną wartość kolumna albo przed obrazu w deleted.column_name lub po obraz w inserted.column_name, zostanie zwrócona do kolumna określonej w zmiennej tabela. Zobacz przykład k poniżej.

Aby uzyskać te same funkcje . WRITE innych znaków lub typów danych binarnych, użyj MATERIAŁY (języka Transact-SQL).

Aktualizowanie tekst, ntext i obraz kolumny

Modyfikowanie text, ntext, lub image kolumny z UPDATE jest inicjowana w kolumnie, tworzone jest skojarzenie wskaźnik prawidłowe tekstu i przydziela co najmniej jedną strona danych, chyba że kolumna jest aktualizowany o wartości NULL. Jeśli instrukcja UPDATE mógł zmienić więcej niż jeden wiersz podczas aktualizowania zarówno klucz klastrowania oraz jeden lub więcej text, ntext, lub image kolumny, częściowe aktualizację tych kolumn jest wykonywane jest pełne zastąpienie wartości.

Aby zastąpić lub zmodyfikować dużych bloków text, ntext, lub image dane, należy użyć WRITETEXT or UPDATETEXT zamiast instrukcja UPDATE.

Important noteImportant Note:

The ntext, text, and image data types will be removed in a future version of Microsoft SQL Server.Należy unikać stosowania tych typów danych w nowej pracy rozwoju i zaplanować do modyfikowania aplikacji, które aktualnie używają ich.Użycie nvarchar(max), varchar(max), and varbinary(max) zamiast niego.Aby uzyskać więcej informacji zobaczUsing Large-Value Data Types.

Przy użyciu, a nie z wyzwalaczy na akcje UPDATE

Po zdefiniowaniu wyzwalacz Z INSTEAD UPDATE działań na tabela, wyzwalacz jest uruchomiona zamiast instrukcja UPDATE.We wcześniejszych wersjach SQL Server obsługują tylko po wyzwalaczy zdefiniowany na aktualizacji i inne instrukcje modyfikacji danych. Klauzula FROM nie można określić za pomocą instrukcja UPDATE, która bezpośrednio lub pośrednio odwołuje widoku z wyzwalacz Z INSTEAD zdefiniowane na nim.Aby uzyskać więcej informacji o, a nie z wyzwalaczy zobacz CREATE TRIGGER (języka Transact-SQL).

Zmienne ustawienia i kolumny

W nazwach zmiennych można używać w instrukcjach UPDATE do wyświetlania wartości stare i nowe wpływ, ale powinno być używane tylko wtedy, gdy instrukcja UPDATE ma wpływ na jeden rekord.Jeśli instrukcja UPDATE ma wpływ na wiele rekordów, aby przywrócić stare i nowe wartości dla każdego rekordu, należy użyć Klauzula wyjście.

Aktualizowanie typowe wyrażenie tabela

Kiedy typowe wyrażenie tabela (CTE) jest instrukcja UPDATE, muszą być zgodne wszystkie odwołania do CTE w instrukcja.Na przykład przypisane alias w klauzula FROM the CTE aliasu należy używać dla wszystkich innych odwołań do CTE.Jednoznaczny odwołania CTE są wymagane, ponieważ CTE nie ma IDENTYFIKATORA obiektu, który SQL Server używa do rozpoznawania domniemanej relacji między obiektem a jego alias. Bez tej relacji planu kwerend może dać łączyć nieoczekiwane zachowanie i wyniki kwerendy niezamierzone.W poniższych przykładach pokazano, poprawne i niepoprawne metody określania CTE po CTE 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

Here is the result set.

Wartość IDENTYFIKATORA

------ -----

1      100

2      200

(dotyczy wiersze 2)

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

Here is the result set.

Wartość IDENTYFIKATORA

------ -----

1      100

2      100

(dotyczy wiersze 2)

Uprawnienia

W tabela miejsce docelowe, wymagane są uprawnienia UPDATE.SELECT uprawnienia są również wymagane dla tabela, aktualizowane, jeśli instrukcja UPDATE zawiera klauzulę WHERE, lub expression w zestaw klauzula używa kolumna w tabela.

UPDATE domyślnych uprawnień dla członków sysadmin ustala rolę serwera db_owner i db_datawriter ról stałej bazy danych i właściciela tabela. Członkowie sysadmin, db_owner, a db_securityadmin role i właściciela tabela mogą przesyłać uprawnień innym użytkownikom.

Przykłady

A.Za pomocą prostej instrukcja UPDATE

Poniższych przykładach w jaki sposób mogą mieć wpływ wszystkie wiersze, przy użyciu klauzula WHERE nie jest używana do określenia wiersz lub wiersze, aby zaktualizować.

W tym przykładzie powoduje zaktualizowanie wartości w Bonus, CommissionPct, a SalesQuota kolumny dla wszystkich wierszy w SalesPerson Tabela.

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

Za pomocą instrukcja UPDATE, można użyć obliczonych wartości.W poniższym przykładzie podwaja się wartość ListPrice kolumna dla wszystkich wierszy w Product Tabela.

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

B.Przy użyciu klauzula WHERE instrukcja UPDATE

W poniższym przykładzie użyto klauzula WHERE, aby określić, które wiersze, które mają zostać zaktualizowane.Na przykład Adventure Works Cycles sprzedaje ich model roweru Road-250 w dwóch kolorów: czerwone i czarne. Aby zmienić kolor czerwony dla tego modelu na czerwony metalicznych postanowiła firmy.Poniższa instrukcja aktualizowane w wierszach Production.Product Tabela dla wszystkich produktów Road-250 czerwone.

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

C.Instrukcja UPDATE przy użyciu informacji z innej tabela

W poniższym przykładzie modyfikuje SalesYTD kolumna w SalesPerson tabelę, aby odzwierciedlić najnowsze sprzedaży w SalesOrderHeader Tabela.

USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
    ON sp.SalesPersonID = so.SalesPersonID
    AND so.OrderDate = (SELECT MAX(OrderDate)
                        FROM Sales.SalesOrderHeader 
                        WHERE SalesPersonID = 
                              sp.SalesPersonID);
GO

W poprzednim przykładzie założono, że tylko jeden sprzedaży jest rejestrowana dla określonego sprzedawcy na określoną data i że aktualizacje są aktualne.Jeśli więcej niż jeden sprzedaży dla określonego sprzedawcy mogą być rejestrowane tego samego dnia, w przykładzie pokazano nie działa poprawnie.W przykładzie jest uruchamiany bez błędów, ale każdy SalesYTD wartość jest aktualizowana tylko jeden sprzedaży, niezależnie od tego, ile sprzedaży faktycznie wystąpił w tym dniu. Wynika to z jednej instrukcja UPDATE nie aktualizuje tego samego wiersza dwa razy.

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

USE AdventureWorks;
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.SalesPersonID = so.SalesPersonID
     GROUP BY so.SalesPersonID);
GO

D.UPDATE przy użyciu klauzula TOP

Następujące aktualizacje przykład VacationHours Kolumna o 25 % 10 wierszy losowo w Employee Tabela.

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

E.UPDATE przy użyciu klauzula wyjście

Następujące aktualizacje przykład VacationHours kolumna w Employee Tabela o 25 procent dla pierwszych 10 wierszy. The OUTPUT klauzula returns the value of VacationHours that exists before applying the UPDATE instrukcja in the DELETED.VacationHours kolumna and the updated value in the INSERTED.VacationHours kolumna to the @MyTableVar tabela variable.

Dwa SELECT instrukcje, należy wykonać, które zwracają wartości w @MyTableVar i wyniki operacji aktualizacji w Employee Tabela. Należy zwrócić uwagę, wyniki w INSERTED.ModifiedDate Kolumna różnią się od wartości w polach ModifiedDate kolumny w Employee Tabela. Dzieje się tak, ponieważ AFTER UPDATE wyzwalacz, który aktualizuje wartości ModifiedDate Data bieżąca jest zdefiniowany na Employee Tabela. Jednak zwrócił kolumny OUTPUT odzwierciedlające dane przed wyzwalacze są uruchamiane. Aby uzyskać więcej przykładów przy użyciu klauzula OUTPUT zobacz Klauzula OUTPUT (języka Transact-SQL).

USE AdventureWorks;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 
OUTPUT INSERTED.EmployeeID,
       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.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

F.Przy użyciu klauzula WITH common_table_expression UPDATE

The following example updates the VacationHours value by 25 percent for all employees reporting directly or indirectly to ManagerID12.The common table expression returns a hierarchical list of employees who report directly to ManagerID12 and employees who report to those employees, and so on.Tylko te wiersze, które są zwracane przez typowe wyrażenie tabela zostaną zmienione.Aby uzyskać więcej informacji na temat typowych wyrażeń tabela cyklicznych zobacz Recursive Queries Using Common Table Expressions.

USE AdventureWorks;
GO
WITH DirectReports(EmployeeID, NewVacationHours, EmployeeLevel)
AS
(SELECT e.EmployeeID, e.VacationHours, 1
  FROM HumanResources.Employee AS e
  WHERE e.ManagerID = 12
  UNION ALL
  SELECT e.EmployeeID, e.VacationHours, EmployeeLevel + 1
  FROM HumanResources.Employee as e
  JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
)
UPDATE HumanResources.Employee
SET VacationHours = VacationHours * 1.25
FROM HumanResources.Employee AS e
JOIN DirectReports AS d ON e.EmployeeID = d.EmployeeID;
GO

G.Aby zmodyfikować dane w kolumna nvarchar(max) przy użyciu UPDATE z klauzula .WRITE

W poniższym przykładzie użyto . Klauzula aktualizacji częściowej wartości w zapisuDocumentSummary, nvarchar(max) kolumna w Production.Document Tabela. Wyraz components zostanie ona zastąpiona wyraz features określając zastąpienie wyrazu, początkowy lokalizacji (przesunięcie) słowa, które zostaną zamienione w istniejących danych, a liczba znaków, które mają być zastępowany (długość). The example also uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVartable variable.

USE AdventureWorks;
GO
DECLARE @MyTableVar table (
    DocumentID int NOT NULL,
    SummaryBefore nvarchar(max),
    SummaryAfter nvarchar(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT INSERTED.DocumentID,
       DELETED.DocumentSummary, 
       INSERTED.DocumentSummary 
    INTO @MyTableVar
WHERE DocumentID = 3 ;
SELECT DocumentID, SummaryBefore, SummaryAfter 
FROM @MyTableVar;
GO

H.Przy użyciu UPDATE .WRITE do dodawania i usuwania danych w kolumna nvarchar(max)

W poniższych przykładach dodawania i usuwania danych z nvarchar(max) Kolumna, która aktualnie ma wartość zestaw wartości null. Ponieważ . WRITE klauzula nie można zmodyfikować kolumny wartości NULL, kolumna najpierw jest wypełniona dane tymczasowe.Te dane są następnie zastąpione poprawne dane za pomocą .WRITE Klauzula. Dodatkowe przykłady dołączania danych do końca wartość kolumna, usunąć (obcięciu) dane z kolumna i, dodatkowo usunąć częściowe dane z kolumna.The SELECT statements display the data modification generated by each UPDATE instrukcja.

USE AdventureWorks;
GO
-- Replacing NULL value with temporary data.
UPDATE Production.Document
SET DocumentSummary = N'Replacing NULL value'
WHERE DocumentID = 1;
GO

SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
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 DocumentID = 1;
GO

SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
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 DocumentID = 1;
GO

SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
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 DocumentID = 1;
GO

SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO

-- Removing partial data beginning at position 9 and ending at 
-- position 21.
UPDATE Production.Document
SET DocumentSummary .WRITE ('',9, 12)
WHERE DocumentID = 1;
GO

SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO

I.Aby zmodyfikować kolumna varbinary(max) przy użyciu UPDATE z OPENROWSET

W poniższym przykładzie zastępuje istniejący obraz, przechowywane w varbinary(max) Kolumna z nowego obrazu. The OPENROWSET funkcja is used with the BULK option to load the image into the kolumna. W tym przykładzie założono, że plik o nazwie Tires.jpg istnieje w ścieżce określonego pliku.

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

J.Za pomocą UPDATE SELECT @ local_variable i złożonych operator

W poniższym przykładzie użyto zmiennej @NewPrice Aby zwiększyć wartość Cena wszystkich rowerów czerwonego przez pobranie bieżącej ceny i dodanie do niej 10.

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

K.Za pomocą UPDATE w procedura przechowywana

W poniższym przykładzie użyto instrukcja UPDATE w procedura przechowywana.Procedura przyjmuje jeden parametr wejściowy @NewHours. Wartość parametru jest używany w instrukcja UPDATE, aby zaktualizować zawartość kolumna VacationHours w tabela HumanResources.Employee. Wyrażenie liter jest używana w klauzula zestaw do warunkowo określenia wartość ustawioną dla VacationHours. Gdy pracownik ma być stosowany (co godzinęSalariedFlag = 0), VacationHours jest ustawiony na bieżącą liczbę godzin oraz wartości określonej w polu @NewHours; w przeciwnym razie VacationHours jest równa wartości określonej w polu @NewHours.

USE AdventureWorks;
GO
CREATE PROCEDURE HumanResources.Update_VacationHours
@NewHours smallint,
@RowCount int OUTPUT
AS 
SET NOCOUNT ON;
UPDATE HumanResources.Employee
SET VacationHours = 
    ( CASE
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours
         ELSE @NewHours
       END
    )
WHERE CurrentFlag = 1;
SET @RowCount = @@ROWCOUNT;
GO

-- Execute the stored procedure and return the number of rows updated to the variable @RowCount
DECLARE @RowCount int;
EXECUTE HumanResources.Update_VacationHours 40, @RowCount OUTPUT;
SELECT @RowCount AS RowCount;

Historia zmian

Microsoft Learning

Dodane w sekcji 'Aktualizacja typowe wyrażenie tabela'.

Przykład dodano „ Using UPDATE w procedurze przechowywanej. „