UPDATE (Transact-SQL)UPDATE (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Изменяет существующие данные в таблице или представлении в SQL Server 2019 (15.x)SQL Server 2019 (15.x).Changes existing data in a table or view in SQL Server 2019 (15.x)SQL Server 2019 (15.x). Примеры см. в разделе Примеры.For examples, see Examples.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

Синтаксис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 Analysis

[ 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 ) ]  
[;]  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

АргументыArguments

WITH <common_table_expression>WITH <common_table_expression>
Задает временный именованный результирующий набор или представление, которые называются обобщенным табличным выражением (CTE), определяемым в пределах области действия инструкции UPDATE.Specifies the temporary named result set or view, also known as common table expression (CTE), defined within the scope of the UPDATE statement. Результирующий набор CTE, на который ссылается инструкция UPDATE, является производным простого запроса.The CTE result set is derived from a simple query and is referenced by UPDATE statement.

Обобщенные табличные выражения могут также использоваться с инструкциями SELECT, INSERT, DELETE и CREATE VIEW.Common table expressions can also be used with the SELECT, INSERT, DELETE, and CREATE VIEW statements. Дополнительные сведения см. в разделе WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP ( expression ) [ PERCENT ]TOP ( expression) [ PERCENT ]
Задает число или процент обновляемых строк.Specifies the number or percent of rows that are updated. expression может быть либо числом, либо процентом от числа строк.expression can be either a number or a percent of the rows.

Строки, на которые ссылается выражение TOP, используемое с инструкциями INSERT, UPDATE и DELETE, не упорядочиваются.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order.

Инструкции INSERT, UPDATE и DELETE требуют заключения expression в круглые скобки в TOP.Parentheses delimiting expression in TOP are required in INSERT, UPDATE, and DELETE statements. Дополнительные сведения см. в разделе TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

table_aliastable_alias
Псевдоним, заданный в предложении FROM и представляющий таблицу или представление, строки которых будут обновлены.The alias specified in the FROM clause representing the table or view from which the rows are to be updated.

server_nameserver_name
Имя сервера (с использованием имени связанного сервера или функции OPENDATASOURCE в качестве имени сервера), на котором расположена таблица или представление.Is the name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. Если указано server_name, необходимо указать database_name и schema_name.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
Имя базы данных.Is the name of the database.

schema_nameschema_name
Имя схемы, которой принадлежит таблица или представление.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
Имя таблицы или представления, из которых должны обновляться строки.Is the name of the table or view from which the rows are to be updated. Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться только на одну базовую таблицу в предложении FROM в представлении.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. Дополнительные сведения об обновляемых представлениях см. в разделе CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Функция OPENQUERY или OPENROWSET, в зависимости от возможностей поставщика.Is either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <Table_Hint_Limited> )WITH ( <Table_Hint_Limited> )
Задает одно или несколько табличных указаний, разрешенных для целевой таблицы.Specifies one or more table hints that are allowed for a target table. Ключевое слово WITH и круглые скобки обязательны.The WITH keyword and the parentheses are required. Использование ключевых слов NOLOCK и READUNCOMMITTED запрещено.NOLOCK and READUNCOMMITTED are not allowed. Сведения о табличных указаниях см. в разделе Табличные указания (Transact-SQL).For information about table hints, see Table Hints (Transact-SQL).

@table_variable@table_variable
Задает переменную table в качестве источника таблицы.Specifies a table variable as a table source.

SETSET
Задает список обновляемых имен столбцов или переменных.Specifies the list of column or variable names to be updated.

column_namecolumn_name
Столбец, содержащий изменяемые данные.Is a column that contains the data to be changed. Аргумент column_name должен существовать в table_or view_name.column_name must exist in table_or view_name. Столбцы идентификаторов не могут быть обновлены.Identity columns cannot be updated.

expressionexpression
Переменная, литеральное значение, выражение или инструкция подзапроса выборки (заключенная в скобки), которые возвращают единственное значение.Is a variable, literal value, expression, or a subselect statement (enclosed with parentheses) that returns a single value. Значение, возвращаемое expression, заменяет существующее значение в column_name или @variable.The value returned by expression replaces the existing value in column_name or @variable.

Примечание

При ссылке на типы данных символов Юникода nchar, nvarchar и ntext выражение 'expression' должно начинаться с заглавной буквы 'N'.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Если префикс «N» не указан, SQL ServerSQL Server выполнит преобразование строки в кодовую страницу, соответствующую параметрам сортировки базы данных или столбца, действующим по умолчанию.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Любые символы, не входящие в эту кодовую страницу, будут утрачены.Any characters not found in this code page are lost.

DEFAULTDEFAULT
Указывает, что существующее в столбце значение будет заменено значением по умолчанию, определенным для данного столбца.Specifies that the default value defined for the column is to replace the existing value in the column. Также может использоваться для присвоения значения NULL, если столбец не имеет значений по умолчанию и может принимать значения NULL.This can also be used to change the column to NULL if the column has no default and is defined to allow null values.

{ += | -= | *= | /= | %= | &= | ^= | |= }{ += | -= | *= | /= | %= | &= | ^= | |= }
Составной оператор присваивания:Compound assignment operator:
+= Сложение и присваивание+= Add and assign
–= Вычитание и присваивание-= Subtract and assign
*= Умножение и присваивание*= Multiply and assign
/= Деление и присваивание/= Divide and assign
%= Остаток от деления и присваивание%= Modulo and assign
&= Выполнение побитовой операции AND и присваивание&= Bitwise AND and assign
^= Выполнение побитовой операции XOR и присваивание^= Bitwise XOR and assign
|= Выполнение побитовой операции OR и присваивание|= Bitwise OR and assign

udt_column_nameudt_column_name
Столбец определяемого пользователем типа.Is a user-defined type column.

property_name | field_nameproperty_name | field_name
Общедоступное свойство или общедоступный элемент данных определяемого пользоватлем типа.Is a public property or public data member of a user-defined type.

method_name ( argument [ , ... n] )method_name ( argument [ ,... n] )
Не статичный метод общего мутатора udt_column_name, принимающий один или несколько аргументов.Is a nonstatic public mutator method of udt_column_name that takes one or more arguments.

. WRITE ( expression , @Offset , @Length ). WRITE (expression,@Offset,@Length)
Указывает, что часть значения column_name будет изменена.Specifies that a section of the value of column_name is to be modified. expression заменяет единицы @Length начиная с @Offset в column_name.expression replaces @Length units starting from @Offset of column_name. В этом предложении можно указать только столбцы типа varchar(max) , nvarchar(max) или varbinary(max) .Only columns of varchar(max), nvarchar(max), or varbinary(max) can be specified with this clause. Аргумент column_name не может иметь значение NULL и не может быть задан именем или псевдонимом таблицы.column_name cannot be NULL and cannot be qualified with a table name or table alias.

expression является значением, которое копируется в column_name.expression is the value that is copied to column_name. Аргумент expression должен преобразовываться или поддерживать неявное преобразование к типу column_name.expression must evaluate to or be able to be implicitly cast to the column_name type. Если для expression установлено значение NULL, @Length не учитывается, а значение в column_name усекается с позиции, на которую указывает аргумент @Offset.If expression is set to NULL, @Length is ignored, and the value in column_name is truncated at the specified @Offset.

Аргумент @Offset — это начальная точка в значении, хранимом в column_name, начиная с которой записывается expression.@Offset is the starting point in the value stored in column_name at which expression is written.Аргумент @Offset задает последовательную позицию разряда, начиная с 0, имеет тип bigint и не может быть отрицательным. @Offset is a zero-based ordinal byte position, is bigint, and cannot be a negative number. Если аргумент @Offset имеет значение NULL, операция обновления добавляет значение expression в конце существующего значения аргумента column_name, а аргумент @Length пропускается.If @Offset is NULL, the update operation appends expression at the end of the existing column_name value and @Length is ignored. Если значение аргумента @Offset больше, чем байтовая длина значения аргумента column_name, компонент Компонент Database EngineDatabase Engine возвращает ошибку.If @Offset is greater than the byte length of the column_name value, the Компонент Database EngineDatabase Engine returns an error. Если сумма значений @Offset и @Length превышает длину базового значения столбца, удаление выполняется до последнего символа этого значения.If @Offset plus @Length exceeds the end of the underlying value in the column, the deletion occurs up to the last character of the value.

Аргумент @Length задает длину части значения столбца начиная с @Offset, которая заменяется на выражение expression.@Length is the length of the section in the column, starting from @Offset, that is replaced by expression.Аргумент @Length имеет тип bigint и не может быть отрицательным. @Length is bigint and cannot be a negative number. Если аргумент @Length имеет значение NULL, операция обновления удаляет все данные, начиная со значения @Offset до конца значения column_name.If @Length is NULL, the update operation removes all data from @Offset to the end of the column_name value.

Дополнительные сведения см. ниже в разделе Обновление типов данных большого объема.For more information, see Updating Large Value Data Types.

@ variable@ variable
Объявленная переменная, которой присваивается значение, возвращенное expression.Is a declared variable that is set to the value returned by expression.

Предложение SET @ variable = column = expression присваивает переменной то же значение, что и столбцу.SET @variable = column = expression sets the variable to the same value as the column. Это отличается от предложения SET @ variable = column, column = expression, присваивающего переменной значение столбца до обновления.This differs from SET @variable = column, column = expression, which sets the variable to the pre-update value of the column.

<OUTPUT_Clause>
Возвращает обновленные данные или основанные на них выражения в рамках выполнения операции UPDATE.Returns updated data or expressions based on it as part of the UPDATE operation. Предложение OUTPUT не поддерживается ни в одной инструкции DML, целью которой являются удаленные таблицы или представления.The OUTPUT clause is not supported in any DML statements that target remote tables or views. Дополнительные сведения об аргументах и поведении этого предложения см. в статье Предложение OUTPUT (Transact-SQL).For more information about the arguments and behavior of this clause, see OUTPUT Clause (Transact-SQL).

FROM <table_source>FROM <table_source>
Определяет, что для определения критериев операции обновления используется таблица, представление или производная таблица.Specifies that a table, view, or derived table source is used to provide the criteria for the update operation. Дополнительные сведения см. в разделе FROM (Transact-SQL).For more information, see FROM (Transact-SQL).

Если обновляемый объект совпадает с объектом в предложении FROM, а в предложении FROM имеется только одна ссылка на этот объект, псевдоним объекта указывать не обязательно.If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified. Если обновляемый объект встречается в предложении FROM несколько раз, одна и только одна ссылка на этот объект не должна указывать псевдоним таблицы.If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта.All other references to the object in the FROM clause must include an object alias.

Представление с триггером INSTEAD OF UPDATE не может быть целью инструкции UPDATE с предложением FROM.A view with an INSTEAD OF UPDATE trigger cannot be a target of an UPDATE with a FROM clause.

Примечание

Любой вызов функции OPENDATASOURCE, OPENQUERY или OPENROWSET в предложении FROM вычисляется отдельно и независимо от любого вызова этих функций, используемого как назначение при обновлении, даже если в двух таких вызовах будут заданы идентичные аргументы.Any call to OPENDATASOURCE, OPENQUERY, or OPENROWSET in the FROM clause is evaluated separately and independently from any call to these functions used as the target of the update, even if identical arguments are supplied to the two calls. В частности, условия фильтра или соединения, применяемые к результатам одного из таких вызовов, никак не влияют на результаты другого.In particular, filter or join conditions applied on the result of one of those calls have no effect on the results of the other.

WHEREWHERE
Задает условия, ограничивающие обновляемые строки.Specifies the conditions that limit the rows that are updated. Существует два вида обновлений в зависимости от используемой формы предложения WHERE.There are two forms of update based on which form of the WHERE clause is used:

  • В поисковых обновлениях задается условие поиска строк, предназначенных к удалению.Searched updates specify a search condition to qualify the rows to delete.

  • В позиционных обновлениях используется предложение CURRENT OF для указания курсора.Positioned updates use the CURRENT OF clause to specify a cursor. Операция обновления выполняется в текущем положении курсора.The update operation occurs at the current position of the cursor.

<search_condition>
Задает условие, которому должны удовлетворять обновляемые строки.Specifies the condition to be met for the rows to be updated. Условие поиска может также представлять собой условие, на котором основано соединение.The search condition can also be the condition upon which a join is based. Количество предикатов, которое может содержать условие поиска, не ограничено.There is no limit to the number of predicates that can be included in a search condition. Дополнительные сведения об условиях поиска и предикатах см. в статье Условие поиска (Transact-SQL).For more information about predicates and search conditions, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
Определяет, что обновление выполняется в текущей позиции указанного курсора.Specifies that the update is performed at the current position of the specified cursor.

Позиционированное обновление с использованием предложения WHERE CURRENT OF обновляет единственную строку в текущем положении курсора.A positioned update using a WHERE CURRENT OF clause updates the single row at the current position of the cursor. Такое обновление может быть более точным, чем поисковое обновление, в котором для выбора строк используется предложение WHERE <search_condition>.This can be more accurate than a searched update that uses a WHERE <search_condition> clause to qualify the rows to be updated. Если условие поиска не определяет однозначно единственную строку, поисковое обновление изменяет несколько строк.A searched update modifies multiple rows when the search condition does not uniquely identify a single row.

GLOBALGLOBAL
Указывает, что аргумент cursor_name ссылается на глобальный курсор.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
Имя открытого курсора, из которого должна быть произведена выборка.Is the name of the open cursor from which the fetch should be made. Если существует как глобальный, так и локальный курсор с именем cursor_name, этот аргумент ссылается на глобальный курсор, если указан аргумент GLOBAL, в противном случае он ссылается на локальный курсор.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. Курсор должен позволять производить обновления.The cursor must allow updates.

cursor_variable_namecursor_variable_name
Имя переменной курсора.Is the name of a cursor variable. Аргумент cursor_variable_name должен содержать ссылку на курсор, обновления которого разрешены.cursor_variable_name must reference a cursor that allows updates.

OPTION ( <query_hint> [ , ... n ] )OPTION ( <query_hint> [ ,... n ] )
Определяет, что для настройки способа, которым компонент Компонент Database EngineDatabase Engine обрабатывает инструкцию, используются подсказки оптимизатора.Specifies that optimizer hints are used to customize the way the Компонент Database EngineDatabase Engine processes the statement. Дополнительные сведения см. в разделе Указания запросов (Transact-SQL).For more information, see Query Hints (Transact-SQL).

РекомендацииBest practices

Для возврата в клиентское приложение количества вставленных строк используйте функцию @@ROWCOUNT.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Дополнительные сведения см. в статье @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

В инструкции UPDATE можно использовать имена переменных для показа старых и новых значений, но только в том случае, если инструкция UPDATE обрабатывает одну запись.Variable names can be used in UPDATE statements to show the old and new values affected, but this should be used only when the UPDATE statement affects a single record. Если инструкция UPDATE затрагивает несколько записей, для возвращения старых и новых значений каждой записи используйте предложение OUTPUT.If the UPDATE statement affects multiple records, to return the old and new values for each record, use the OUTPUT clause.

Проявляйте осторожность, указывая предложение FROM при задании критериев для операции обновления.Use caution when specifying the FROM clause to provide the criteria for the update operation. Результаты инструкции UPDATE не определены, если инструкция включает предложение FROM, в котором для каждого вхождения обновляемого столбца не задано единственное значение, то есть если инструкция UPDATE не является детерминированной.The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. Например, в инструкции UPDATE следующего скрипта обе строки в Table1 удовлетворяют условиям предложения FROM в инструкции UPDATE, но не определено, какая строка из Table1 используется для обновления строки в Table2.For example, in the UPDATE statement in the following script, both rows in Table1 meet the qualifications of the FROM clause in the UPDATE statement; but it is undefined which row from Table1 is used to update the row in Table2.

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

Та же проблема может возникнуть при объединении предложений FROM и WHERE CURRENT OF.The same problem can occur when the FROM and WHERE CURRENT OF clauses are combined. В следующем примере обе строки в Table2 удовлетворяют условиям предложения FROM в инструкции UPDATE.In the following example, both rows in Table2 meet the qualifications of the FROM clause in the UPDATE statement. Не определено, какая строка из Table2 должна использоваться для обновления строки в Table1.It is undefined which row from Table2 is to be used to update the row in Table1.

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

Поддержка совместимостиCompatibility support

Поддержка использования подсказок READUNCOMMITTED и NOLOCK в предложении FROM, применяемом к целевой таблице инструкции UPDATE или DELETE, будет удалена в следующей версии SQL ServerSQL Server.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. Следует избегать использования этих указаний в таком контексте в новой разработке и запланировать изменение приложений, использующих их в настоящий момент.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

Типы данныхData types

Все столбцы, имеющие тип данных char и nchar, дополняются справа до заданной длины.All char and nchar columns are right-padded to the defined length.

Если параметр ANSI_PADDING имеет значение OFF, все конечные пробелы удаляются из данных, вставленных в столбцы varchar и nchar, за исключением строк, содержащих только пробелы.If ANSI_PADDING is set to OFF, all trailing spaces are removed from data inserted into varchar and nvarchar columns, except in strings that contain only spaces. Эти строки усекаются до пустых строк.These strings are truncated to an empty string. Если ANSI_PADDING имеет значение ON, вставляются конечные пробелы.If ANSI_PADDING is set to ON, trailing spaces are inserted. Драйвер ODBC для Microsoft SQL Server и поставщик OLE DB для SQL Server автоматически устанавливают ANSI_PADDING ON для каждого соединения.The Microsoft SQL Server ODBC driver and OLE DB Provider for SQL Server automatically set ANSI_PADDING ON for each connection. Этот параметр можно настроить в источниках данных ODBC или устанавливая атрибуты или свойства соединений.This can be configured in ODBC data sources or by setting connection attributes or properties. Дополнительные сведения см. в разделе SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

Обновление столбцов типа text, ntext и imageUpdating text, ntext, and image columns

Изменение столбцов типа text, ntext или image с помощью инструкции UPDATE инициализирует столбец, присваивает ему допустимый текстовый указатель и выделяет по крайней мере одну страницу данных, если столбец не обновляется значением NULL.Modifying a text, ntext, or image column with UPDATE initializes the column, assigns a valid text pointer to it, and allocates at least one data page, unless the column is being updated with NULL.

Чтобы заменить или изменить большие блоки данных типа text, ntext или image, вместо UPDATE используется инструкция WRITETEXT или UPDATETEXT.To replace or modify large blocks of text, ntext, or image data, use WRITETEXT or UPDATETEXT instead of the UPDATE statement.

Если инструкция UPDATE могла обновить несколько строк при обновлении как ключа кластеризации, так и одного или нескольких столбцов типа text, ntext или image, то частичное обновление этих столбцов выполняется как полная замена значений.If the UPDATE statement could change more than one row while updating both the clustering key and one or more text, ntext, or image columns, the partial update to these columns is executed as a full replacement of the values.

Важно!

Типы данных ntext, text и image будут исключены в следующей версии MicrosoftMicrosoftSQL ServerSQL Server.The ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL ServerSQL Server. Следует избегать использования этих типов данных при новой разработке и запланировать изменение приложений, использующих их в настоящий момент.Avoid using these data types in new development work, and plan to modify applications that currently use them. Вместо них следует использовать типы данных nvarchar(max), varchar(max)и varbinary(max) .Use nvarchar(max), varchar(max), and varbinary(max) instead.

Обновление типов данных большого объемаUpdating large value data types

Используйте предложение . WRITE ( expression , @Offset , @Length ) для выполнения частичного или полного обновления типов данных varchar(max) , nvarchar(max) и varbinary(max) .Use the . WRITE (expression,@Offset,@Length) clause to perform a partial or full update of varchar(max), nvarchar(max), and varbinary(max) data types.

Например, частичное обновление столбца с типом varchar(max) может удалить или изменить только первые 200 байтов в столбце (200 символов при использовании символов ASCII), тогда как полное обновление удалит или изменит все данные в столбце.For example, a partial update of a varchar(max) column might delete or modify only the first 200 bytes of the column (200 characters if using ASCII characters), whereas a full update would delete or modify all the data in the column. Обновления .WRITE, вставляющие или добавляющие новые данные, имеют минимальное протоколирование, если установлена простая модель восстановления базы данных или модель восстановления с неполным протоколированием..WRITE updates that insert or append new data are minimally logged if the database recovery model is set to bulk-logged or simple. Если обновляются существующие значения, ведение журнала не сокращается до минимума.Minimal logging is not used when existing values are updated. Дополнительные сведения см. в статье Журнал транзакций (SQL Server).For more information, see The Transaction Log (SQL Server).

Компонент Компонент Database EngineDatabase Engine преобразует частичное обновление в полное, если инструкция UPDATE приводит к одному из следующих действий.The Компонент Database EngineDatabase Engine converts a partial update to a full update when the UPDATE statement causes either of these actions:

  • Изменения ключевого столбца секционированного представления или таблицы.Changes a key column of the partitioned view or table.
  • Изменение более одной строки, а также обновление ключа неуникального кластеризованного индекса на непостоянное значение.Modifies more than one row and also updates the key of a nonunique clustered index to a nonconstant value.

Нельзя использовать предложение .WRITE для обновления столбца NULL или присваивания аргументу column_name значения NULL.You cannot use the .WRITE clause to update a NULL column or set the value of column_name to NULL.

Параметры @Offset и @Length указываются в байтах для типов данных varbinary и varchar и в байтовых парах для типа данных nvarchar.@Offset and @Length are specified in bytes for varbinary and varchar data types and in byte-pairs for the nvarchar data type. Дополнительные сведения о длине строковых типов данных см. в разделах char и varchar (Transact-SQL) и nchar и nvarchar (Transact-SQL).For more information on string data type lengths, see char and varchar (Transact-SQL) and nchar and nvarchar (Transact-SQL).

В целях увеличения производительности рекомендуется вставлять или обновлять данные фрагментами, кратными 8040 байтам.For best performance, we recommend that data be inserted or updated in chunk sizes that are multiples of 8040 bytes.

Если на столбец, измененный предложением .WRITE, ссылается предложение OUTPUT, полное значение столбца либо исходный образ в deleted. column_name или преобразованный образ в inserted. column_name возвращается определенному столбцу в табличной переменной.If the column modified by the .WRITE clause is referenced in an OUTPUT clause, the complete value of the column, either the before image in deleted.column_name or the after image in inserted.column_name, is returned to the specified column in the table variable. См. пример Т ниже.See example R that follows.

Чтобы добиться функциональности предложения .WRITE при обработке других символьных или двоичных типов данных, используется STUFF (Transact-SQL).To achieve the same functionality of .WRITE with other character or binary data types, use the STUFF (Transact-SQL).

Обновление столбцов определяемого пользователем типаUpdating User-defined Type columns

Обновление столбцов определяемого пользователем типа можно выполнить одним из следующих способов.Updating values in user-defined type columns can be accomplished in one of the following ways:

  • Предоставление значения типа системных данных SQL ServerSQL Server происходит, если определяемый пользователем тип поддерживает явное или неявное преобразование из этого типа.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. Следующий пример демонстрирует, как обновить значение в столбце определяемого пользователем типа Point путем явного преобразования строки.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • Вызов метода, помеченного в качестве мутатора определенного пользователем типа для осуществления обновления.Invoking a method, marked as a mutator, of the user-defined type, to perform the update. Следующий пример вызывает метод мутатора типа Point с именем SetXY.The following example invokes a mutator method of type Point named SetXY. Это обновляет состояние экземпляра типа.This updates the state of the instance of the type.

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

    Примечание

    SQL ServerSQL Server возвращает ошибку, если метод мутатора возвращает значение NULL языка Transact-SQLTransact-SQL либо если новое значение, порожденное методом мутатора, соответствует значению NULL.returns an error if a mutator method is invoked on a Transact-SQLTransact-SQL null value, or if a new value produced by a mutator method is null.

  • Изменение значения зарегистрированного свойства или общедоступного элемента данных определяемого пользователем типа.Modifying the value of a registered property or public data member of the user-defined type. Выражение, предоставляющее значение, должно допускать неявное преобразование в тип свойства.The expression supplying the value must be implicitly convertible to the type of the property. В следующем примере изменяется значение свойства X определяемого пользователем типа Point.The following example modifies the value of property X of user-defined type Point.

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

    Для изменения различных свойств одного и того же столбца определяемого пользователем типа нужно выполнить несколько инструкций UPDATE или использовать метод мутатора соответствующего типа.To modify different properties of the same user-defined type column, issue multiple UPDATE statements, or invoke a mutator method of the type.

Обновление данных FILESTREAMUpdating FILESTREAM data

Инструкция UPDATE позволяет обновить поля FILESTREAM значением NULL, пустым значением или встроенными данными относительно небольшого размера.You can use the UPDATE statement to update a FILESTREAM field to a null value, empty value, or a relatively small amount of inline data. Однако при работе с большими объемами данных более эффективно передавать поток в файл с использованием интерфейсов Win32.However, a large amount of data is more efficiently streamed into a file by using Win32 interfaces. При обновлении поля FILESTREAM происходит изменение базовых данных BLOB в файловой системе.When you update a FILESTREAM field, you modify the underlying BLOB data in the file system. Если в поле FILESTREAM содержится значение NULL, данные BLOB, связанные с этим полем, удаляются.When a FILESTREAM field is set to NULL, the BLOB data associated with the field is deleted. Для частичного обновления данных потока FILESTREAM недопустимо использовать метод .WRITE().You cannot use .WRITE(), to perform partial updates to FILESTREAM data. Дополнительные сведения см. в разделе FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

Обработка ошибокError handling

Если обновление строки нарушает ограничение, правило или установку NULL для столбца либо новое значение имеет несовместимый тип данных, то инструкция отменяется, возвращается ошибка и никакие записи не обновляются.If an update to a row violates a constraint or rule, violates the NULL setting for the column, or the new value is an incompatible data type, the statement is canceled, an error is returned, and no records are updated.

Если инструкция UPDATE при оценке выражения встречает арифметическую ошибку (переполнение, деление на ноль или ошибку домена), обновление не выполняется.When an UPDATE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) during expression evaluation, the update is not performed. Остальная часть пакета не выполняется и возвращается сообщение об ошибке.The rest of the batch is not executed, and an error message is returned.

Если обновление столбца или столбцов, участвующих в кластеризованном индексе, приводит к тому, что размер кластеризованного индекса и строки превышает 8 060 байт, обновление заканчивается неудачей и возвращается сообщение об ошибке.If an update to a column or columns participating in a clustered index causes the size of the clustered index and the row to exceed 8,060 bytes, the update fails and an error message is returned.

СовместимостьInteroperability

Инструкции UPDATE разрешается использовать в теле определяемых пользователем функций только в том случае, если изменяемая таблица является табличной переменной.UPDATE statements are allowed in the body of user-defined functions only if the table being modified is a table variable.

Если для операций UPDATE по отношению к таблице определен триггер INSTEAD OF, вместо инструкции UPDATE запускается этот триггер.When an INSTEAD OF trigger is defined on UPDATE actions against a table, the trigger is running instead of the UPDATE statement. Ранние версии SQL ServerSQL Server поддерживали для UPDATE и других инструкций изменения данных только определение триггеров AFTER.Earlier versions of SQL ServerSQL Server only support AFTER triggers defined on UPDATE and other data modification statements. В инструкции UPDATE, которая прямо или косвенно ссылается на представление с определенным для него триггером INSTEAD OF, не может быть указано предложение FROM.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. Дополнительные сведения о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

ограниченияLimitations and restrictions

В инструкции UPDATE, которая прямо или косвенно ссылается на представление с определенным для него триггером INSTEAD OF, не может быть указано предложение FROM.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view that has an INSTEAD OF trigger defined on it. Дополнительные сведения о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

Если обобщенное табличное выражение указывается в качестве цели инструкции UPDATE, должны совпадать все ссылки на это выражение в инструкции.When a common table expression (CTE) is the target of an UPDATE statement, all references to the CTE in the statement must match. Например, если для обобщенного табличного выражения в предложении FROM назначается псевдоним, то этот псевдоним должен использоваться для всех остальных ссылок на обобщенное табличное выражение.For example, if the CTE is assigned an alias in the FROM clause, the alias must be used for all other references to the CTE. Требуются однозначные ссылки на обобщенное табличное выражение, так как обобщенное табличное выражение не имеет идентификатор объекта, который SQL ServerSQL Server использует для распознавания неявной связи между объектом и его псевдонимом.Unambiguous CTE references are required because a CTE does not have an object ID, which SQL ServerSQL Server uses to recognize the implicit relationship between an object and its alias. В отсутствие такой связи план запроса может непредвиденным образом построить работу с соединениями, что приведет к нежелательным результатам запроса.Without this relationship, the query plan may produce unexpected join behavior and unintended query results. В следующих примерах показаны правильные и неправильные методы задания обобщенного табличного выражения, когда оно является целевым объектом операции обновления.The following examples demonstrate correct and incorrect methods of specifying a CTE when the CTE is the target object of the update operation.

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.

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

Инструкция UPDATE с неправильно подобранными ссылками на обобщенное табличное выражение.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.

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

Режим блокировкиLocking behavior

Инструкция UPDATE получает монопольную блокировку (X) на строки, которые она изменяет, и держит блокировку до тех пор, пока транзакция не завершится.An UPDATE statement acquires an exclusive (X) lock on any rows that it modifies, and holds these locks until the transaction completes. В зависимости от плана запроса для инструкции UPDATE, количества изменяемых строк и уровня изоляции транзакции, блокировки могут быть получены на уровне страницы или на уровне таблицы, а не на уровне строк.Depending on the query plan for the UPDATE statement, the number of rows being modified, and the isolation level of the transaction, locks may be acquired at the PAGE level or TABLE level rather than the ROW level. Чтобы избежать этих блокировок более высокого уровня, можно разделить инструкцию UPDATE, которая распространяется на тысячи или более строк, на пакеты и убедиться, что все условия объединения и фильтрации поддерживаются индексами.To avoid these higher level locks, consider dividing update statements that affect thousands of rows or more into batches, and ensure that any join and filter conditions are supported by indexes. Дополнительные сведения о блокировке механизмов в SQL Server см. в статье Блокировка в ядре СУБД.See the article on Locking in the Database Engine for more details on locking mechanics in SQL Server.

Режим ведения журналаLogging behavior

Инструкция UPDATE записывается в журнал, однако частичные обновления типов данных с большими значениями с использованием предложения .WRITE регистрируются на минимальном уровне.The UPDATE statement is logged; however, partial updates to large value data types using the .WRITE clause are minimally logged. Дополнительные сведения см. ниже в подразделе "Обновление типов данных большого объема" приведенного ранее раздела "Типы данных".For more information, see "Updating Large Value Data Types" in the earlier section "Data Types".

БезопасностьSecurity

РазрешенияPermissions

Разрешения UPDATE необходимы для целевой таблицы.UPDATE permissions are required on the target table. Кроме того, требуются разрешения на выполнение SELECT для обновляемой таблицы, если инструкция UPDATE содержит предложение WHERE или если аргумент expression в предложении SET использует столбец в этой таблице.SELECT permissions are also required for the table being updated if the UPDATE statement contains a WHERE clause, or if expression in the SET clause uses a column in the table.

Разрешения UPDATE по умолчанию предоставляются членам предопределенной роли сервера sysadmin, членам предопределенных ролей баз данных db_owner и db_datawriter, а также владельцу таблицы.UPDATE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Члены ролей sysadmin, db_owner и db_securityadmin, а также владелец таблицы могут передавать разрешения другим пользователям.Members of the sysadmin, db_owner, and db_securityadmin roles, and the table owner can transfer permissions to other users.

ПримерыExamples

КатегорияCategory Используемые элементы синтаксисаFeatured syntax elements
Базовый синтаксисBasic Syntax UPDATEUPDATE
Ограничение обновляемых строкLimiting the Rows that Are Updated WHERE • TOP • WITH обобщенное табличное выражение • WHERE CURRENT OFWHERE • TOP • WITH common table expression • WHERE CURRENT OF
Установка значений столбцаSetting Column Values вычисляемые значения • составные операторы • значения по умолчанию • вложенные запросыcomputed values • compound operators • default values • subqueries
Указание целевых объектов, отличных от стандартных таблицSpecifying Target Objects Other than Standard Tables представления • табличные переменные • псевдонимы таблицыviews • table variables • table aliases
Обновление данных на основе данных из других таблицUpdating Data Based on Data From Other Tables FROMFROM
Обновление строк в удаленной таблицеUpdating Rows in a Remote Table связанный сервер • OPENQUERY • OPENDATASOURCElinked server • OPENQUERY • OPENDATASOURCE
Обновление типов данных больших объектовUpdating Large Object Data Types .WRITE • OPENROWSET.WRITE • OPENROWSET
Обновление определяемых пользователем типов данныхUpdating User-defined Types определяемые пользователем типыuser-defined types
Переопределение поведения по умолчанию для оптимизатора запросов с помощью указанийOverriding the Default Behavior of the Query Optimizer by Using Hints табличные подсказки • подсказки в запросахtable hints • query hints
Сбор результатов выполнения инструкции UPDATECapturing the Results of the UPDATE Statement OUTPUT, предложениеOUTPUT clause
Использование инструкции UPDATE в других инструкцияхUsing UPDATE in Other Statements Хранимые процедуры • TRY...CATCHStored Procedures • TRY...CATCH

Основной синтаксисBasic syntax

В примерах в этом разделе описывается базовая функциональность инструкции UPDATE с помощью минимального необходимого синтаксиса.Examples in this section demonstrate the basic functionality of the UPDATE statement using the minimum required syntax.

A.A. Использование простой инструкции UPDATEUsing a simple UPDATE statement

В следующем примере обновляется один столбец для всех строк в таблице Person.Address.The following example updates a single column for all rows in the Person.Address table.

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

Б.B. Обновление нескольких столбцовUpdating multiple columns

В следующем примере выполняется обновление значений в столбцах Bonus, CommissionPct и SalesQuota для всех строк в таблице SalesPerson.The following example updates the values in the Bonus, CommissionPct, and SalesQuota columns for all rows in the SalesPerson table.

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

Ограничение обновляемых строкLimiting the Rows that Are Updated

В примерах в этом разделе описываются способы ограничения количества строк, на которые влияет инструкция UPDATE.Examples in this section demonstrate ways that you can use to limit the number of rows affected by the UPDATE statement.

В.C. Применение предложения WHEREUsing the WHERE clause

В следующем примере предложение WHERE используется для указания строк, которые необходимо обновить.The following example uses the WHERE clause to specify which rows to update. Инструкция обновляет значение в столбце Color таблицы Production.Product для всех строк, в которых имеется существующее значение Red в столбце Color и имеется значение в столбце Name, который начинается с Road-250.The statement updates the value in the Color column of the Production.Product table for all rows that have an existing value of 'Red' in the Color column and have a value in the Name column that starts with 'Road-250'.

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

Г.D. Использование предложения TOPUsing the TOP clause

В следующем примере предложение TOP используется для ограничения числа строк, изменяемых в процессе выполнения инструкции UPDATE.The following examples use the TOP clause to limit the number of rows that are modified in an UPDATE statement. Если в инструкции UPDATE указано предложение TOP (n), то операция обновления выполняется для произвольного подмножества в n строк.When a TOP (n) clause is used with UPDATE, the update operation is performed on a random selection of 'n' number of rows. В следующем примере в столбце VacationHours для случайных 10 строк таблицы Employee значение меняется на 25 %.The following example updates the VacationHours column by 25 percent for 10 random rows in the Employee table.

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

Если нужно применить изменения с предложением TOP в определенной последовательности, укажите во вложенной инструкции выборки инструкцию ORDER BY.If you must use TOP to apply updates in a meaningful chronology, you must use TOP together with ORDER BY in a subselect statement. В следующем примере изменяется длительность отпуска для 10 сотрудников, имеющих наибольший стаж работы.The following example updates the vacation hours of the 10 employees with the earliest hire dates.

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. Использование предложения WITH обобщенное_табличное_выражениеUsing the WITH common_table_expression clause

В следующем примере обновляется значение PerAssemblyQty для всех частей и компонентов, прямо или косвенно используемых для создания ProductAssemblyID 800.The following example updates the PerAssemblyQty value for all parts and components that are used directly or indirectly to create the ProductAssemblyID 800. Обобщенное табличное выражение возвращает иерархический список частей, которые непосредственно используются для сборки ProductAssemblyID 800, и частей, которые используются для сборки этих компонентов, и т. д.The common table expression returns a hierarchical list of parts that are used directly to build ProductAssemblyID 800 and parts that are used to build those components, and so on. Изменяются только строки, возвращенные обобщенным табличным выражением.Only the rows returned by the common table expression are modified.

USE AdventureWorks2012;  
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. Использование предложения WHERE CURRENT OFUsing the WHERE CURRENT OF clause

В следующем примере предложение WHERE CURRENT OF используется только для обновления строк, на которых установлен курсор.The following example uses the WHERE CURRENT OF clause to update only the row on which the cursor is positioned. Если курсор основан на соединении, изменяется только таблица table_name, указанная в инструкции UPDATE.When a cursor is based on a join, only the table_name specified in the UPDATE statement is modified. Другие таблицы, участвующие в курсоре, не затрагиваются.Other tables participating in the cursor are not affected.

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

Установка значений столбцаSetting Column Values

В примерах этого раздела описывается обновление столбцов с помощью вычисляемых значений, вложенных запросов и значений DEFAULT.Examples in this section demonstrate updating columns by using computed values, subqueries, and DEFAULT values.

Ж.G. Указание вычисляемого значенияSpecifying a computed value

В следующих примерах используются вычисляемые значения в инструкции UPDATE.The following examples uses computed values in an UPDATE statement. В примере удваивается значение столбца ListPrice для всех строк в таблице Product.The example doubles the value in the ListPrice column for all rows in the Product table.

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

З.H. Задание составного оператораSpecifying a compound operator

В следующем примере демонстрируется использование переменной @NewPrice для увеличения цены красных велосипедов прибавлением 10 к текущей цене.The following example uses the variable @NewPrice to increment the price of all red bicycles by taking the current price and adding 10 to it.

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

В следующем примере используется составной оператор += для добавления данных ' - tool malfunction' к существующему значению в столбце Name для строк, имеющих значение ScrapReasonID от 10 до 12.The following example uses the compound operator += to append the data ' - tool malfunction' to the existing value in the column Name for rows that have a ScrapReasonID between 10 and 12.

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

И.I. Задание вложенного запроса в предложении SETSpecifying a subquery in the SET clause

В следующем примере используется вложенный запрос в предложении SET для определения значения, которое используется для обновления столбца.The following example uses a subquery in the SET clause to determine the value that is used to update the column. Вложенный запрос должен возвращать только скалярное значение (то есть одно значение для каждой строки).The subquery must return only a scalar value (that is, a single value per row). В примере изменяется столбец SalesYTD в таблице SalesPerson для отображения самой последней информации о продажах, зафиксированной в таблице SalesOrderHeader.The example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table. Вложенный запрос проводит статистическую обработку сведений о продажах по всем продавцам в инструкции UPDATE.The subquery aggregates the sales for each salesperson in the UPDATE statement.

USE AdventureWorks2012;  
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. Обновление строк с использованием значений DEFAULTUpdating rows using DEFAULT values

В следующем примере для столбца CostRate задается значение по умолчанию (0,00) для всех строк, значение CostRate которых больше 20.00.The following example sets the CostRate column to its default value (0.00) for all rows that have a CostRate value greater than 20.00.

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

Указание целевых объектов, отличных от стандартных таблицSpecifying Target Objects Other Than Standard Tables

В примерах этого раздела описаны методы обновления строк с указанием представления, псевдонима таблицы или табличной переменной.Examples in this section demonstrate how to update rows by specifying a view, table alias, or table variable.

Л.K. Указание представления в качестве целевого объектаSpecifying a view as the target object

В следующем примере выполняется обновление строк таблицы путем указания представления в качестве целевого объекта.The following example updates rows in a table by specifying a view as the target object. Определение представления ссылается на несколько таблиц, однако инструкция UPDATE была успешно выполнена, поскольку она ссылается на столбцы только одной из базовых таблиц.The view definition references multiple tables, however, the UPDATE statement succeeds because it references columns from only one of the underlying tables. При выполнении инструкции UPDATE произойдет сбой, если были указаны столбцы из обеих таблиц.The UPDATE statement would fail if columns from both tables were specified. Дополнительные сведения см. в разделе Изменение данных через представление.For more information, see Modify Data Through a View.

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

М.L. Задание псевдонима таблицы в качестве целевого объектаSpecifying a table alias as the target object

В следующем примере производится обновление строк в таблице Production.ScrapReason.The follow example updates rows in the table Production.ScrapReason. Псевдоним таблицы, заданный для ScrapReason в предложении FROM, указывается как целевой объект в предложении UPDATE.The table alias assigned to ScrapReason in the FROM clause is specified as the target object in the UPDATE clause.

USE AdventureWorks2012;  
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. Задание табличной переменной в качестве целевого объектаSpecifying a table variable as the target object

В следующем примере производится обновление строк в табличной переменной.The following example updates rows in a table variable.

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

Обновление данных на основе данных из других таблицUpdating Data Based on Data From Other Tables

В примерах этого раздела описаны методы обновления строк одной таблицы на основе данных в другой таблице.Examples in this section demonstrate methods of updating rows from one table based on information in another table.

О.N. Использование инструкции UPDATE с данными из другой таблицыUsing the UPDATE statement with information from another table

В следующем примере изменяется столбец SalesYTD в таблице SalesPerson для отображения самой последней информации о продажах, зафиксированной в таблице SalesOrderHeader.The following example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table.

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

В предыдущем примере подразумевается, что на конкретного менеджера по продажам на каждую конкретную дату записана только одна продажа и выполнены все текущие обновления.The previous example assumes that only one sale is recorded for a specified salesperson on a specific date and that updates are current. Если в один и тот же день для указанного менеджера может иметься более одной продажи, приведенный пример будет работать неправильно.If more than one sale for a specified salesperson can be recorded on the same day, the example shown does not work correctly. Пример выполняется без ошибок, но каждое из значений SalesYTD обновляется только для одной из продаж, вне зависимости от действительного количества продаж в этот день.The example runs without error, but each SalesYTD value is updated with only one sale, regardless of how many sales actually occurred on that day. Это происходит потому, что одиночная инструкция UPDATE никогда не обновляет одну и ту же строку дважды.This is because a single UPDATE statement never updates the same row two times.

В ситуации, когда у данного менеджера по продажам имеется несколько продаж в день, все продажи для каждого из менеджеров по продажам должны быть собраны вместе инструкцией UPDATE, как показано в следующем примере.In the situation in which more than one sale for a specified salesperson can occur on the same day, all the sales for each sales person must be aggregated together within the UPDATE statement, as shown in the following example:

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

Обновление строк в удаленной таблицеUpdating rows in a remote table

В примерах в этом разделе описаны способы обновления строк в удаленной целевой таблице с использованием в качестве ссылки на удаленную таблицу связанного сервера или функции, возвращающей набор строк.Examples in this section demonstrate how to update rows in a remote target table by using a linked server or a rowset function to reference the remote table.

П.O. Обновление данных в удаленной таблице с использованием связанного сервераUpdating data in a remote table by using a linked server

В следующем примере обновляется таблица на удаленном сервере.The following example updates a table on a remote server. Этот пример начинается с создания ссылки на удаленный источник данных с помощью хранимой процедуры sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Затем имя связанного сервера MyLinkedServer указывается в качестве одного из четырех компонентов имени объекта в формате сервер.каталог.схема.объект.The linked server name, MyLinkedServer, is then specified as part of the four-part object name in the form server.catalog.schema.object. Обратите внимание, что необходимо указать действительное имя сервера для @datasrc.Note that you must specify a valid server name for @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'AdventureWorks2012';  
GO  
USE AdventureWorks2012;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
UPDATE MyLinkedServer.AdventureWorks2012.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

Т.P. Обновление данных в удаленной таблице с помощью функции OPENQUERYUpdating data in a remote table by using the OPENQUERY function

В следующем примере выполняется обновление строки в удаленной таблице с помощью вызова функции OPENQUERY, возвращающей набор строк.The following example updates a row in a remote table by specifying the OPENQUERY rowset function. В этом примере используется имя связанного сервера, созданного в предыдущем примере.The linked server name created in the previous example is used in this example.

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

У.Q. Обновление данных в удаленной таблице с помощью функции OPENDATASOURCEUpdating data in a remote table by using the OPENDATASOURCE function

В следующем примере выполняется обновление строки в удаленной таблице с помощью вызова функции OPENDATASOURCE, возвращающей набор строк.The following example updates a row in a remote table by specifying the OPENDATASOURCE rowset function. Определите допустимое имя сервера для источника данных, используя формат server_name или server_name\instance_name.Specify a valid server name for the data source by using the format server_name or server_name\instance_name. Возможно, потребуется настроить у экземпляра SQL ServerSQL Server параметр Ad Hoc Distributed Queries.You may need to configure the instance of SQL ServerSQL Server for Ad Hoc Distributed Queries. Дополнительные сведения см. в статье Параметр конфигурации сервера "ad hoc distributed queries".For more information, see ad hoc distributed queries Server Configuration Option.

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

Обновление типов данных больших объектовUpdating Large Object data types

В примерах в этом разделе описываются методы обновления значений в столбцах, определенных с типами данных больших объектов (LOB).Examples in this section demonstrate methods of updating values in columns that are defined with large object (LOB) data types.

Ф.R. Использование инструкции UPDATE с предложением .WRITE для изменения данных в столбце nvarchar(max)Using UPDATE with .WRITE to modify data in an nvarchar(max) column

В следующем примере предложение .WRITE используется для обновления частичного значения столбца DocumentSummary типа nvarchar(max) в таблице Production.Document.The following example uses the .WRITE clause to update a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table. Слово components заменяется словом features путем указания слова для замены, начального положения (смещения) заменяемого слова в существующих данных и количества заменяемых символов (длины).The word components is replaced with the word features by specifying the replacement word, the starting location (offset) of the word to be replaced in the existing data, and the number of characters to be replaced (length). В этом примере также используется предложение OUTPUT для возврата исходного и преобразованного образов столбца DocumentSummary в табличную переменную @MyTableVar.The example also uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar table variable.

USE AdventureWorks2012;  
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. Использование UPDATE с предложением .WRITE для добавления и удаления данных в столбце типа nvarchar(max)Using UPDATE with .WRITE to add and remove data in an nvarchar(max) column

В следующем примере данные добавляются в столбец типа nvarchar(max) , имеющий текущее значение NULL, и удаляются из него.The following examples add and remove data from an nvarchar(max) column that has a value currently set to NULL. Поскольку предложение .WRITE не может использоваться для изменения столбца со значением NULL, этот столбец сначала заполняется временными данными.Because the .WRITE clause cannot be used to modify a NULL column, the column is first populated with temporary data. Затем они заменяются правильными данными с помощью предложения .WRITE.This data is then replaced with the correct data by using the .WRITE clause. В дополнительных примерах данные добавляются в конец значения столбца, удаляются из столбца (усекаются) и, наконец, удаляются частичные данные из столбца.The additional examples append data to the end of the column value, remove (truncate) data from the column and, finally, remove partial data from the column. Инструкции SELECT выводят на экран изменения данных, создаваемые каждой из инструкций UPDATE.The SELECT statements display the data modification generated by each UPDATE statement.

USE AdventureWorks2012;  
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.T. Использование инструкции UPDATE с функцией OPENROWSET для изменения столбца типа varbinary(max)Using UPDATE with OPENROWSET to modify a varbinary(max) column

В следующем примере существующий образ в столбце типа varbinary(max) заменяется новым образом.The following example replaces an existing image stored in a varbinary(max) column with a new image. Для загрузки образа в столбец используется функция OPENROWSET с параметром BULK.The OPENROWSET function is used with the BULK option to load the image into the column. В этом примере предполагается, что по заданному пути существует файл с именем Tires.jpg.This example assumes that a file named Tires.jpg exists in the specified file path.

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

Ф.U. Использование UPDATE для изменения данных FILESTREAMUsing UPDATE to modify FILESTREAM data

В следующем примере инструкция UPDATE используется для изменения данных в файлах файловой системы.The following example uses the UPDATE statement to modify the data in the file system file. Не рекомендуется использовать этот метод для потоковой передачи больших объемов данных в файл.We do not recommend this method for streaming large amounts of data to a file. Используйте соответствующие интерфейсы Win32.Use the appropriate Win32 interfaces. В следующем примере любой текст в записи файла заменяется текстом Xray 1.The following example replaces any text in the file record with the text Xray 1. Дополнительные сведения см. в разделе FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

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

Обновление определяемых пользователем типов данныхUpdating User-defined Types

В следующих примерах изменяются значения в столбцах определяемых пользователем типов данных CLR.The following examples modify values in CLR user-defined type (UDT) columns. Описываются три метода.Three methods are demonstrated. Дополнительные сведения об определяемых пользователем столбцах см. в разделе Определяемые пользователем типы данных CLR.For more information about user-defined columns, see CLR User-Defined Types.

V.V. Использование системных типов данныхUsing a system data type

Определяемый пользователем тип можно обновить путем предоставления значения в типе системных данных SQL ServerSQL Server при поддержке определяемым пользователем типа явного или неявного преобразования из этого типа.You can update a UDT by supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. Следующий пример демонстрирует, как обновить значение в столбце определяемого пользователем типа Point путем явного преобразования строки.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

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

Ц.W. Вызов методаInvoking a method

Определяемый пользователем тип можно обновить путем вызова метода, отмеченного в качестве мутатора определяемого пользователем типа, для выполнения обновления.You can update a UDT by invoking a method, marked as a mutator, of the user-defined type, to perform the update. Следующий пример вызывает метод мутатора типа Point с именем SetXY.The following example invokes a mutator method of type Point named SetXY. Это обновляет состояние экземпляра типа.This updates the state of the instance of the type.

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

X.X. Изменение значения свойства или элемента данныхModifying the value of a property or data member

Определяемый пользователем тип можно обновить путем изменения значения зарегистрированного свойства или общедоступного элемента данных определяемого пользователем типа.You can update a UDT by modifying the value of a registered property or public data member of the user-defined type. Выражение, предоставляющее значение, должно допускать неявное преобразование в тип свойства.The expression supplying the value must be implicitly convertible to the type of the property. В следующем примере изменяется значение свойства X определяемого пользователем типа Point.The following example modifies the value of property X of user-defined type Point.

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

Переопределение поведения по умолчанию для оптимизатора запросов с помощью указанийOverriding the Default Behavior of the Query Optimizer by Using Hints

Примеры в этом разделе описывают использование табличных подсказок и подсказок в запросах для временного переопределения поведения оптимизатора запросов при обработке инструкции UPDATE.Examples in this section demonstrate how to use table and query hints to temporarily override the default behavior of the query optimizer when processing the UPDATE statement.

Внимание!

Поскольку оптимизатор запросов SQL ServerSQL Server обычно выбирает наилучший план выполнения запроса, подсказки рекомендуется использовать только опытным разработчикам и администраторам баз данных в качестве последнего средства.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Ш.Y. Задание табличной подсказкиSpecifying a table hint

В следующем примере задается табличное указание TABLOCK.The following example specifies the table hint TABLOCK. Эта подсказка указывает, что на таблицу Production.Product накладывается совмещаемая блокировка, удерживаемая до завершения инструкции UPDATE.This hint specifies that a shared lock is taken on the table Production.Product and held until the end of the UPDATE statement.

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

Z.Z. Задание подсказки в запросеSpecifying a query hint

В следующем примере задается указание запросаOPTIMIZE FOR (@variable) в инструкции UPDATE.The following example specifies the query hintOPTIMIZE FOR (@variable) in the UPDATE statement. Эта подсказка указывает на необходимость использования оптимизатором запросов при компиляции и оптимизации запросов конкретного значения локальной переменной.This hint instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. Значение используется только в процессе оптимизации запроса, но не в процессе выполнения.The value is used only during query optimization, and not during query execution.

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

Сбор результатов выполнения инструкции UPDATECapturing the results of the UPDATE statement

Примеры в этом разделе описывают использование предложения OUTPUT для возврата данных для всех строк, изменившихся в результате выполнения инструкции UPDATE, либо выражений на основе этих данных.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an UPDATE statement. Эти результаты могут быть возвращены приложению, например для вывода подтверждающих сообщений, архивирования и т. п.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

AA.AA. Использование инструкции UPDATE с предложением OUTPUTUsing UPDATE with the OUTPUT clause

В следующем примере значения в столбце VacationHours в первых 10 строках таблицы Employee уменьшаются до 25 % от исходных значений, а в столбец ModifiedDate заносится текущая дата.The following example updates the column VacationHours in the Employee table by 25 percent for the first 10 rows and also sets the value in the column ModifiedDate to the current date. Предложение OUTPUT возвращает значение VacationHours, существующее до применения инструкции UPDATE в столбце deleted.VacationHours, и обновленное значение в столбце inserted.VacationHours к табличной переменной @MyTableVar.The OUTPUT clause returns the value of VacationHours that exists before applying the UPDATE statement in the deleted.VacationHours column and the updated value in the inserted.VacationHours column to the @MyTableVar table variable.

Две следующие инструкции SELECT возвращают значения в табличную переменную @MyTableVar, а результаты операции обновления — в таблицу Employee.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Дополнительные примеры использования предложения OUTPUT см. в статье Предложение OUTPUT (Transact-SQL).For more examples using the OUTPUT clause, see OUTPUT Clause (Transact-SQL).

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

Использование инструкции UPDATE в других инструкцияхUsing UPDATE in other statements

В примерах в этом разделе описывается использование UPDATE в других инструкциях.Examples in this section demonstrate how to use UPDATE in other statements.

АБ.AB. Использование UPDATE в хранимой процедуреUsing UPDATE in a stored procedure

В следующем примере инструкция UPDATE используется в хранимой процедуре.The following example uses an UPDATE statement in a stored procedure. Процедура принимает один входной параметр @NewHours и один выходной параметр @RowCount.The procedure takes one input parameter, @NewHours and one output parameter @RowCount. Значение параметра @NewHours используется в инструкции UPDATE для обновления столбца VacationHours в таблице HumanResources.Employee.The @NewHours parameter value is used in the UPDATE statement to update the column VacationHours in the table HumanResources.Employee. Выходной параметр @RowCount используется для возврата значения числа задействованных строк в локальную переменную.The @RowCount output parameter is used to return the number of rows affected to a local variable. Выражение CASE используется в предложении SET для условного определения значения, которое задано для столбца VacationHours.The CASE expression is used in the SET clause to conditionally determine the value that is set for VacationHours. Если для сотрудника применяется почасовая ставка оплаты (SalariedFlag = 0), то в столбце VacationHours устанавливается текущее количество часов плюс значение, заданное в @NewHours. В противном случае в столбце VacationHours указывается значение, заданное в @NewHours.When the employee is paid hourly (SalariedFlag = 0), VacationHours is set to the current number of hours plus the value specified in @NewHours; otherwise, VacationHours is set to the value specified in @NewHours.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE HumanResources.Update_VacationHours  
@NewHours SMALLINT  
AS   
SET NOCOUNT ON;  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours  
         ELSE @NewHours  
       END  
    )  
WHERE CurrentFlag = 1;  
GO  
  
EXEC HumanResources.Update_VacationHours 40;  

АВ.AC. Использование UPDATE в блоке TRY...CATCHUsing UPDATE in a TRY...CATCH Block

В следующем примере инструкция UPDATE используется в блоке TRY...CATCH для обработки ошибок выполнения, которые могут возникнуть во время операции обновления.The following example uses an UPDATE statement in a TRY...CATCH block to handle execution errors that may occur during the update operation.

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

Примеры: Azure Synapse Analytics (Хранилище данных SQL)Azure Synapse Analytics (SQL Data Warehouse) и Параллельное хранилище данныхParallel Data WarehouseExamples: Azure Synapse Analytics (Хранилище данных SQL)Azure Synapse Analytics (SQL Data Warehouse) and Параллельное хранилище данныхParallel Data Warehouse

АГ.AD. Использование простой инструкции UPDATEUsing a simple UPDATE statement

В следующем примере показано, как могут быть обработаны все строки, если не использовать предложение WHERE для указания обновляемой строки или строк.The following examples show how all rows can be affected when a WHERE clause is not used to specify the row (or rows) to update.

Происходит обновление значений в столбцах EndDate и CurrentFlag для всех строк в таблице DimEmployee.This example updates the values in the EndDate and CurrentFlag columns for all rows in the DimEmployee table.

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

В инструкции UPDATE можно также использовать вычисляемые значения.You can also use computed values in an UPDATE statement. В следующем примере удваивается значение столбца ListPrice для всех строк в таблице Product.The following example doubles the value in the ListPrice column for all rows in the Product table.

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

АД.AE. Использование инструкции UPDATE с предложением WHEREUsing the UPDATE statement with a WHERE clause

В следующем примере предложение WHERE используется для указания строк, которые необходимо обновить.The following example uses the WHERE clause to specify which rows to update.

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

АЕ.AF. Использование инструкции UPDATE с меткойUsing the UPDATE statement with label

В следующем примере показано использование LABEL с инструкцией UPDATE.The following example shows use of a LABEL for the UPDATE statement.

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

АЖ.AG. Использование инструкции UPDATE с данными из другой таблицыUsing the UPDATE statement with information from another table

В этом примере создается таблица для хранения итогов продаж по годам.This example creates a table to store total sales by year. Обновляются итоги продаж за 2004 год с помощью инструкции SELECT в таблице FactInternetSales.It updates the total sales for the year 2004 by running a SELECT statement against the FactInternetSales table.

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

АЗ.AH. Соединение ANSI для инструкций обновленияANSI join for update statements

В этом примере показано, как обновить данные на основе результатов соединения с другой таблицей.This example shows how to update data based on the result from joining another table.

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

См. также:See Also

CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
Курсоры (Transact-SQL) Cursors (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
Функции для работы с изображениями и текстом (Transact-SQL) Text and Image Functions (Transact-SQL)
WITH common_table_expression (Transact-SQL) WITH common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)FILESTREAM (SQL Server)
Поддержка параметров сортировки и Юникода Collation and Unicode Support
Однобайтовые и многобайтовые кодировкиSingle-Byte and Multibyte Character Sets