UPDATE (Transact-SQL)

Изменяет существующие данные в таблице или представлении.

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

Синтаксис

[ WITH <common_table_expression> [...n] ]
UPDATE 
    [ TOP ( expression ) [ PERCENT ] ] 
    { <object> | rowset_function_limited 
     [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
    }
    SET 
        { column_name = { expression | DEFAULT | NULL }
          | { udt_column_name.{ { property_name = expression 
                                | field_name = expression } 
                               | method_name ( argument [ ,...n ] ) 
                              } 
            }
          | column_name { .WRITE ( expression , @Offset , @Length ) }
          | @variable = expression 
          | @variable = column = expression [ ,...n ] 
        } [ ,...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}

Аргументы

  • WITH <common_table_expression>
    Задает временный именованный результирующий набор или представление, которые называются обобщенным табличным выражением (CTE), определяемым в пределах области действия инструкции UPDATE. Результирующий набор CTE, на который ссылается инструкция UPDATE, является производным простого запроса.

    Обобщенные табличные выражения могут также использоваться с инструкциями SELECT, INSERT, DELETE и CREATE VIEW. Дополнительные сведения см. в разделе WITH общее_табличное_выражение (Transact-SQL).

  • TOP ( expression**)** [ PERCENT ]
    Указывает количество или процент строк, которые будут обновлены. expression может быть либо числом, либо процентной долей строк.

    Строки, на которые ссылается выражение TOP, используемое с инструкциями INSERT, UPDATE и DELETE, не упорядочиваются.

    В инструкциях INSERT, UPDATE и DELETE скобки, в которые заключено expression, необходимы. Дополнительные сведения см. в разделе TOP (Transact-SQL).

  • server_name
    Имя сервера (с использованием имени связанного сервера или функции OPENDATASOURCE в качестве имени сервера), на котором расположена таблица или представление. Если задан аргумент server_name, то необходимо также, чтобы были указаны аргументы database_name и schema_name.
  • database_name
    Имя базы данных.
  • schema_name
    Имя схемы, к которой принадлежит таблица или представление.
  • table_or view_name
    Имя таблицы или представления, из которых должны обновляться строки.

    Переменная table в своей области действия может использоваться в качестве источника таблицы в инструкции UPDATE.

    Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться только на одну базовую таблицу в предложении FROM данного представления. Дополнительные сведения об обновляемых представлениях см. в разделе CREATE VIEW (Transact-SQL).

  • WITH ( <Table_Hint_Limited> )
    Задает одну или несколько табличных подсказок, разрешенных для целевой таблицы. Ключевое слово WITH и круглые скобки обязательны. Использование аргументов NOLOCK и READUNCOMMITTED запрещено. Сведения о табличных подсказках см. в разделе Табличная подсказка (Transact-SQL).
  • SET
    Задает список обновляемых имен столбцов или переменных.
  • column_name
    Столбец, содержащий обновляемые данные. Столбец с именем column_name должен существовать в table_or view_name. Столбцы идентификаторов не могут быть обновлены.
  • expression
    Переменная, символьное значение, выражение или подзапрос выборки (заключенный в скобки), которые возвращают единственное значение. Значение, возвращаемое expression, заменяет существующее значение в column_name или @variable.
  • DEFAULT
    Определяет, что существующее значение в столбце должно заменяться значением по умолчанию. Также может использоваться для присвоения значения NULL, если столбец не имеет значений по умолчанию и может принимать значения NULL.
  • udt_column_name
    Столбец пользовательского типа.
  • property_name | field_name
    Общедоступное свойство или общедоступный элемент данных пользовательского типа.
  • method_name**(**argument [ ,... n] )
    Не статичный метод общего мутатора udt_column_name, принимающий один или несколько аргументов.
  • .WRITE (expression,@Offset,@Length**)**
    Указывает, что должен быть изменен раздел значения column_name. expression заменяет в column_name@Length элементы, начиная с позиции @Offset. С этим предложением можно указывать только столбцы типа varchar(max), nvarchar(max) или varbinary(max). column_name не может иметь значения NULL и не может дополняться именем таблицы или псевдонимом таблицы.

    expression — значение, которое копируется в столбец column_name. Аргумент expression должен иметь результат типа column_name или неявно приводиться к этому типу. Если для expression установлено значение NULL, аргумент @Length не учитывается, а значение в column_name усекается с позиции, на которую указывает аргумент @Offset.

    Аргумент @Offset — начальная точка в значении column_name, в которую записывается значение expression. Аргумент @Offset — отсчитываемая от нуля порядковая позиция с типом данных bigint и не может быть отрицательным числом. Если аргумент @Offset имеет значение NULL, операция обновления добавляет значение expression в конец существующего значения аргумента column_name, а аргумент @Length пропускается. Если значение аргумента @Offset больше, чем длина значения аргумента column_name, компонент Microsoft SQL Server 2005 Database Engine возвращает ошибку. Если сумма значений @Offset и @Length превышают длину базового значения столбца, удаление выполняется до последнего символа этого значения. Если сумма значений @Offset и LEN(expression) больше чем базовый объявленный размер, возникает ошибка.

    @Length — это длина раздела в столбце, начиная с @Offset, который заменяется expression. @Length имеет тип данных bigint и не может принимать отрицательных значений. Если аргумент @Length имеет значение NULL, операция обновления удаляет все данные, начиная со значения @Offset до конца значения column_name.

    Дополнительные сведения см. ниже, в разделе «Примечания».

  • **@**variable
    Объявленная переменная, которой присваивается значение, возвращенное expression.

    SET **@**variable = column = expression присваивает переменной то же значение, что и столбцу. Это отличается от предложения SET **@**variable = column, column = expression, присваивающего переменной значение столбца до обновления.

  • <OUTPUT_Clause>
    Возвращает обновленные данные или основанные на них выражения в рамках выполнения операции UPDATE. Предложение OUTPUT не поддерживается ни в одной инструкции DML, целью которой являются удаленные таблицы или представления. Дополнительные сведения см. в разделе Предложение OUTPUT (Transact-SQL).
  • FROM <источник_таблицы>
    Определяет, что для определения критериев операции обновления используется таблица, представление или производный источник таблицы. Дополнительные сведения см. в разделе FROM (Transact-SQL).

    Если обновляемый объект тот же самый, что и объект в предложении FROM, и в предложении FROM имеется только одна ссылка на этот объект, псевдоним объекта указывать необязательно. Если обновляемый объект встречается в предложении FROM несколько раз, одна и только одна ссылка на этот объект не должна указывать псевдоним таблицы. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта.

    Представление с триггером INSTEAD OF UPDATE не может быть целью инструкции UPDATE с предложением FROM.

  • WHERE
    Задает условия, ограничивающие обновляемые строки. Существует два вида обновлений, в зависимости от используемой формы предложения WHERE.

    • В поисковых обновлениях задается условие поиска строк, предназначенных к удалению.
    • В позиционных обновлениях используется предложение CURRENT OF для указания курсора. Операция обновления выполняется в текущем положении курсора.
  • <search_condition>
    Задает условие, которому должны удовлетворять обновляемые строки. Условие поиска может также представлять собой условие, на котором основано соединение. Количество предикатов, которое может содержать условие поиска, не ограничено. Дополнительные сведения о предикатах и условиях поиска см. в разделе Условие поиска (Transact-SQL).
  • CURRENT OF
    Определяет, что обновление выполняется в текущей позиции указанного курсора.
  • GLOBAL
    Указывает, что аргумент cursor_name ссылается на глобальный курсор.
  • cursor_name
    Имя открытого курсора, из которого должна производиться выборка. Если существует как глобальный, так и локальный курсор с именем cursor_name, этот аргумент ссылается на глобальный курсор, если указан аргумент GLOBAL, в противном случае он ссылается на локальный курсор. Курсор должен позволять производить обновления.
  • cursor_variable_name
    Имя переменной курсора. Аргумент cursor_variable_name должен ссылаться на курсор, разрешающий обновления.
  • OPTION ( <подсказка_запроса> [ ,... n ] )
    Определяет, что для настройки способа, которым компонент Database Engine обрабатывает инструкцию, используются подсказки оптимизатора. Дополнительные сведения см. в разделе Подсказка в запросе (Transact-SQL).

Замечания

Инструкция UPDATE записывается в журнал, однако частичные обновления типов данных большого объема с использованием предложения **.**WRITE регистрируются на минимальном уровне. Дополнительные сведения см. ниже в разделе «Обновление типов данных большого объема».

Инструкции UPDATE разрешается использовать в теле пользовательских функций только в том случае, если изменяемая таблица является переменной типа table.

Если обновление строки нарушает ограничение, правило или установку NULL для столбца, либо новое значение имеет несовместимый тип данных, инструкция отменяется, возвращается ошибка, и никакие записи не обновляются.

Если инструкция UPDATE при вычислении выражения встречает арифметическую ошибку (переполнение, деление на ноль или ошибку домена), обновление не выполняется. Остальная часть пакета не выполняется и возвращается сообщение об ошибке.

Если обновление столбца или столбцов, участвующих в кластеризованном индексе, приводит к тому, что размер кластеризованного индекса и строки превышает 8 060 байт, обновление заканчивается неудачей, и возвращается сообщение об ошибке.

Если инструкция UPDATE могла обновить несколько строк при обновлении как кластеризованного ключа, так и одного или нескольких столбцов типа text, ntext или image, частичное обновление этих столбцов выполняется как полная замена значений.

Все столбцы типов char и nchar дополняются справа до заданной длины.

Значение параметра SET ROWCOUNT не учитывается инструкциями UPDATE для удаленных таблиц и для локальных и удаленных секционированных представлений.

Если ANSI_PADDING имеет значение OFF, все конечные пробелы удаляются из данных, вставленных в столбцы varchar и nvarchar, за исключением строк, содержащих только пробелы. Эти строки усекаются до пустых строк. Если ANSI_PADDING имеет значение ON, вставляются конечные пробелы. Драйвер ODBC для Microsoft SQL Server и поставщик OLE DB для SQL Server автоматически устанавливают ANSI_PADDING ON для каждого соединения. Этот параметр можно настроить в источниках данных ODBC или устанавливая атрибуты или свойства соединений. Дополнительные сведения см. в разделе SET ANSI_PADDING (Transact-SQL).

Позиционное обновление с использованием предложения WHERE CURRENT OF обновляет единственную строку в текущем положении курсора. Такое обновление может быть более точным, чем поисковое обновление, в котором для выбора строк используется предложение WHERE <search_condition>. Если условие поиска не определяет однозначно единственную строку, поисковое обновление изменяет несколько строк.

Использование инструкции UPDATE с предложением FROM

Результаты инструкции UPDATE не определены, если инструкция включает предложение FROM, в котором для каждого вхождения обновляемого столбца не задано единственное значение, то есть если инструкция UPDATE не является детерминированной. Например, в инструкции UPDATE следующего сценария обе строки в Table1 удовлетворяют условиям предложения FROM в инструкции UPDATE, но не определено, какая строка из Table1 используется для обновления строки в Table2.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
    DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL
    DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1 
    (ColA int 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);
INSERT INTO dbo.Table1 VALUES(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. В следующем примере обе строки в Table2 удовлетворяют условиям предложения FROM в инструкции UPDATE. Не определено, какая строка из Table2 должна использоваться для обновления строки в Table1.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
    DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL
    DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1
    (c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);
GO
CREATE TABLE dbo.Table2
    (d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES (1, 10);
INSERT INTO dbo.Table2 VALUES (1, 20);
INSERT INTO dbo.Table2 VALUES (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

Обновление столбцов пользовательского типа

Обновление столбцов пользовательского типа можно выполнить одним из следующих способов.

  • Задав значение системного типа данных SQL Server, если пользовательский тип поддерживает явные или неявные преобразования этого типа. Следующий пример демонстрирует, как обновить значение в столбце пользовательского типа Point путем явного преобразования строки.

    UPDATE Cities
    SET Location = CONVERT(Point, '12.3:46.2')
    WHERE Name = 'Anchorage';
    
  • Вызвав метод, отмеченный в качестве мутатора, пользовательского типа для осуществления обновления. Следующий пример вызывает метод мутатора типа Point с именем SetXY. Это обновляет состояние экземпляра типа.

    UPDATE Cities
    SET Location.SetXY(23.5, 23.5)
    WHERE Name = 'Anchorage';
    
    ms177523.note(ru-ru,SQL.90).gifПримечание.
    SQL Server возвращает ошибку, если метод мутатора возвращает значение NULL языка Transact-SQL либо если новое значение, порожденное методом мутатора, соответствует значению NULL.
  • Изменив значение зарегистрированного свойства или общедоступного элемента данных пользовательского типа. Выражение, предоставляющее значение, должно допускать неявное преобразование в тип свойства. В следующем примере изменяется значение свойства X пользовательского типа Point.

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

    Для изменения различных свойств одного и того же столбца пользовательского типа нужно выполнить несколько инструкций UPDATE или использовать метод мутатора соответствующего типа.

Обновление типов данных большого объема

Для частичного или полного обновления типов данных varchar(max), nvarchar(max) и varbinary(max) используется предложение .WRITE (expression, @Offset**,**@Length). Например, частичное обновление столбца с типом varchar(max) может удалить или изменить только первые 200 символов, тогда как полное обновление удалит или изменит все данные в столбце. Обновления с помощью предложения **.**WRITE, вставляющие или присоединяющие новые данные, регистрируются на минимальном уровне, если установлена простая модель восстановления базы данных или модель восстановления с неполным протоколированием. Когда обновляются существующие значения, занесение записей в журнал не сокращается до минимума. Дополнительные сведения см. в разделе Операции с минимальным протоколированием.

Компонент SQL Server 2005 Database Engine преобразует частичное обновление в полное, если инструкция UPDATE приводит к одному из следующих действий.

  • Изменению ключевого столбца секционированного представления или таблицы.
  • Изменению более чем одной строки, а также к обновлению ключа неуникального кластеризованного индекса на непостоянное значение.

Нельзя использовать предложение . WRITE для обновления столбца NULL или для присваивания аргументу column_name значения NULL.

Параметры @Offset и @Length указываются в байтах для типов данных varbinary и varchar и в символах для типа данных nvarchar. Соответствующие смещения вычисляются для параметров сортировки в двухбайтовых кодировках (DBCS).

В целях увеличения производительности рекомендуется вставлять или обновлять данные фрагментами, кратными 8040 байтам.

Если на столбец, изменяемый предложением **.**WRITE, ссылается предложение OUTPUT, указанному столбцу в переменной типа table возвращается полное значение данного столбца в первоначальном образе в **deleted.**column_name или в последующем образе в **inserted.**column_name. См. пример Ж ниже.

Чтобы добиться функциональности предложения **.**WRITE при обработке других символьных или двоичных типов данных, используется STUFF (Transact-SQL).

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

Изменение столбцов типа text, ntext или image с помощью инструкции UPDATE инициализирует столбец, присваивает ему допустимый текстовый указатель и выделяет, по крайней мере, одну страницу данных, если столбец не обновляется значением NULL.

Чтобы заменить или изменить большие блоки данных типов text, ntext или image, вместо UPDATE используется инструкция WRITETEXT или UPDATETEXT.

ms177523.note(ru-ru,SQL.90).gifВажно!
Типы данных ntext, text и image будут удалены в следующей версии Microsoft SQL Server. Следует избегать использования этих типов данных при новой разработке и запланировать изменение приложений, использующих их в настоящий момент. Вместо них следует использовать типы данных nvarchar(max), varchar(max) и varbinary(max). Дополнительные сведения см. в разделе Использование типов данных больших значений.

Использование триггеров INSTEAD OF в операциях UPDATE

Если для операций UPDATE по отношению к таблице определен триггер INSTEAD OF, вместо инструкции UPDATE запускается этот триггер. Ранние версии SQL Server поддерживали для UPDATE и других инструкций изменения данных только определение триггеров AFTER. В инструкции UPDATE, которая прямо или косвенно ссылается на представление с определенным для него триггером INSTEAD OF, не может быть указано предложение FROM. Дополнительные подробности о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).

Установка переменных и столбцов

В инструкции UPDATE можно использовать имена переменных для показа старых и новых значений, но только в том случае, если инструкция UPDATE обрабатывает одну запись. Если инструкция UPDATE затрагивает несколько записей, для возвращения старых и новых значений каждой записи используйте предложение OUTPUT.

Разрешения

Требуются разрешения на выполнение UPDATE в целевой таблице. Также требуются разрешения на выполнение SELECT для обновляемой таблицы, если инструкция UPDATE содержит предложение WHERE, или если аргумент expression в предложении SET использует столбец в этой таблице.

Разрешения на выполнение UPDATE имеют по умолчанию члены фиксированной серверной роли sysadmin, члены фиксированных ролей базы данных db_owner и db_datawriter, а также владелец таблицы. Члены ролей sysadmin, db_owner и db_securityadmin и владелец таблицы могут передавать разрешения другим пользователям.

Примеры

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

В следующем примере показано, как могут быть обработаны все строки, если не использовать предложение WHERE для указания обновляемой строки или строк.

Происходит обновлений значений в столбцах Bonus, CommissionPct и SalesQuota для всех строк в таблице SalesPerson.

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

В инструкции UPDATE можно также использовать вычисленные значения. В следующем примере удваивается значение столбца ListPrice для всех строк в таблице Product.

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

Б. Использование инструкции UPDATE с предложением WHERE

В следующем примере предложение WHERE используется для указания строк, которые необходимо обновить. Например, Adventure Works Cycles продает свои велосипеды модели Road-250 двух цветов: красного и черного. Компания решила поменять красный цвет этой модели на красный с металлическим блеском. Следующая инструкция обновляет строки в таблице Production.Product для всех красных моделей Road-250.

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

В. Использование инструкции UPDATE с данными из другой таблицы

В следующем примере изменяется столбец SalesYTD в таблице SalesPerson для отображения самой последней информации о продажах, зафиксированной в таблице SalesOrderHeader.

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

В предыдущем примере подразумевается, что на конкретного менеджера по продажам на каждую конкретную дату записана только одна продажа и что выполнены все текущие обновления. Если в один и тот же день для указанного менеджера может быть записано более одной продажи, приведенный пример будет работать неправильно. Пример выполняется без ошибок, но каждое из значений SalesYTD обновляется только для одной из продаж, вне зависимости от действительного количества продаж в этот день. Это происходит потому, что инструкция UPDATE при простом обновлении никогда не обновляет одну и ту же строку дважды.

В ситуации, когда один менеджер может зарегистрировать за один день несколько продаж, все продажи одного менеджера должны объединяться внутри инструкции UPDATE, как показано в следующем примере:

USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + 
    (SELECT SUM(so.SubTotal) 
     FROM Sales.SalesOrderHeader AS so
     WHERE so.OrderDate = (SELECT MAX(OrderDate)
                           FROM Sales.SalesOrderHeader AS so2
                           WHERE so2.SalesPersonID = 
                                 so.SalesPersonID)
     AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID
     GROUP BY so.SalesPersonID);
GO

Г. Использование инструкции UPDATE с предложением TOP

В следующем примере столбец VacationHours в таблице Employee обновляется на 25% для 10 произвольных строк.

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

Д. Использование инструкции UPDATE с предложением OUTPUT

В следующем примере столбец VacationHours в таблице Employee обновляется на 25% для первых 10 строк. Предложение OUTPUT возвращает значение VacationHours, существующее до применения инструкции UPDATE в столбце DELETED.VacationHours, и обновленного значения в столбце INSERTED.VacationHours к переменной @MyTableVar типа table.

Затем следуют две инструкции SELECT, которые возвращают значения в таблицу @MyTableVar, а результаты операции обновления — в таблицу Employee. Заметьте, что результаты в столбце INSERTED.ModifiedDate отличны от значений в столбце ModifiedDate таблицы Employee. Это происходит потому, что триггер AFTER UPDATE, обновляющий значение ModifiedDate до текущей даты, определен в таблице Employee. Однако столбцы, возвращенные предложением OUTPUT, отражают состояние данных перед срабатыванием триггеров. Дополнительные примеры использования предложения OUTPUT см. в разделе Предложение OUTPUT (Transact-SQL).

USE AdventureWorks;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 
OUTPUT INSERTED.EmployeeID,
       DELETED.VacationHours,
       INSERTED.VacationHours,
       INSERTED.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

Е. Использование инструкции UPDATE с предложением WITH обобщенное_табличное_выражение

В следующем примере обновляется на 25 процентов значение VacationHours для всех работников, прямо или косвенно подчиняющихся ManagerID``12. Обобщенное табличное выражение возвращает иерархический список работников, подчиняющихся непосредственно ManagerID``12, а также работников, подчиняющихся этим работниками и т.д. Модифицируются только строки, возвращенные обобщенным табличным выражением. Дополнительные сведения о рекурсивных обобщенных табличных выражениях см. в разделе Рекурсивные запросы, использующие обобщенные табличные выражения.

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

Ж. Использование инструкции UPDATE с предложением .WRITE для изменения данных в столбце nvarchar(max)

В следующем примере предложение **.**WRITE используется для обновления частичного значения столбца DocumentSummary типа nvarchar(max) в таблице Production.Document. Слово components заменяется словом features путем указания слова для замены, начального положения (смещения) заменяемого слова в существующих данных и количества заменяемых символов (длины). В этом примере также используется предложение OUTPUT для возвращения первоначального и последующего образов столбца DocumentSummary переменной @MyTableVar типа table.

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

З. Использование UPDATE с предложением .WRITE для добавления и удаления данных в столбце типа nvarchar(max)

В следующем примере данные добавляются в столбец nvarchar(max), имеющий текущее значение NULL, или и удаляются из него. Поскольку предложение **.**WRITE не может использоваться для изменения столбца со значением NULL, этот столбец сначала заполняется временными данными. Затем они заменяются правильными данными с помощью предложения .WRITE. В дополнительных примерах данные добавляются в конец значения столбца, удаляются из столбца (усекаются) и, наконец, удаляются частичные данные из столбца. Инструкции SELECT выводят на экран изменения данных, создаваемые каждой из инструкций UPDATE.

USE AdventureWorks;
GO
-- Replacing NULL value with temporary data.
UPDATE Production.Document
SET DocumentSummary = N'Replacing NULL value'
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Replacing temporary data with the correct data. Setting @Length to NULL 
-- truncates all existing data from the @Offset position.
UPDATE Production.Document
SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Appending additional data to the end of the column by setting 
-- @Offset to NULL.
UPDATE Production.Document
SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Removing all data from @Offset to the end of the existing value by 
-- setting expression to NULL. 
UPDATE Production.Document
SET DocumentSummary .WRITE (NULL, 56, 0)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO
-- Removing partial data beginning at position 9 and ending at 
-- position 21.
UPDATE Production.Document
SET DocumentSummary .WRITE ('',9, 12)
WHERE DocumentID = 1;
GO
SELECT DocumentSummary 
FROM Production.Document
WHERE DocumentID = 1;
GO

И. Использование инструкции UPDATE с функцией OPENROWSET для изменения столбца типа varbinary(max)

В следующем примере существующее изображение в столбце varbinary(max) заменяется новым изображением. Для загрузки изображения в столбец используется функция OPENROWSET с параметром BULK. В этом примере предполагается, что по заданному пути существует файл с именем Tires.jpg.

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

См. также

Справочник

CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
Курсоры (Transact-SQL)
DELETE (Transact-SQL)
INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
Функции для работы с типами данных text и image (Transact-SQL)
WITH общее_табличное_выражение (Transact-SQL)

Другие ресурсы

Обновление данных в таблице

Справка и поддержка

Получение помощи по SQL Server 2005