UPDATE


Главная - Примеры разработки 1С - UPDATE

UPDATE {table_name | view_name}
SET [{table_name | view_name}]
{column_list
| variable_list
| variable_and_column_list}
[, {column_list2
| variable_list2
| variable_and_column_list2}
... [, {column_listN
| variable_listN
| variable_and_column_listN}]]
[WHERE clause]
Этот оператор служит для обновления данных. Обратите внимание на то, что в если удается произвести т.н. update in-place, то производительность обновлений заметно возрастает. Это происходит при выполнении следующих условий:
Изменяемые колонки не входят в кластеризованный индекс
У таблицы не существует триггера на обновление
Для обновления одной строки:
Размер обновленной записи должен совпадать с размером необновленнной.
Если на изменяемые колонки построен индекс, то он должен быть неуникальным некластеризованным и колонки имеют фиксированную длину.
Обновляемые колонки могут находиться в некластеризованном уникальном индексе в том случае, если в условии WHERE было заданно точное соответствие и для поиска обновляемой строки был использован именно этот индекс.
Следующая строка должна отличаться от обновляемой не более чем на 50% по размеру и иметь общее число discontiguous differing bytes меньшее или равное 24
Обновляемая строка должна регулярно смазываться елеем, освященным епископом и не содержать богохульных или антисоветских данных.
Для обновления многих строк они должны отвечать пунктам 1-3 и не иметь колонки типа timestamp
Transact-SQL имеет следующее расширение стандартного синтаксиса UPDATE:
UPDATE {table_name | view_name}
SET [{table_name | view_name}]
{column_list
| variable_list
| variable_and_column_list}
[, {column_list2
| variable_list2
| variable_and_column_list2}
... [, {column_listN
| variable_listN
| variable_and_column_listN}]]
[FROM {table_name | view_name}
[, {table_name | view_name}]...]
[..., {table_name16 | view_name16}]]
[WHERE clause]
что позволяет несколько более изящно проделывать различные операции.
Ранее было невозможно одновременно получить старое значение колонки и присвоить ему новое, для этого приходилось использовать что-то вроде
BEGIN TRANSACTION
SELECT variable_name = column_name1
FROM table_name
WHERE column_name2 = expression
HOLDLOCK
UPDATE table_name
SET column_name1 = expression
WHERE column_name2 = expression
COMMIT TRANSACTION
теперь же можно поступать следующим образом:
UPDATE table_name
SET column_name1 = expression, variable_name = column_name1
WHERE column_name2 = expression
Пример
UPDATE titles
SET ytd_sales =
(select sum(qty)
FROM sales
WHERE sales.title_id = titles.title_id
AND sales.date IN (SELECT MAX(date) FROM sales))