Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Инструкция UPDATE cоветы и хитрости SQL Server

Платформа SQL Server поддерживает большинство основных компонентов инструкции UPDATE стандарта ANSI, но не поддерживаются ключевые слова ONLY и ARRAY и не поддерживается возможность обновления массивов. В SQL Server функциональность инструкции UPDATE была расширена путем добавления подсказок по таблице при помощи предложения WITH, добавления подсказок по запросу при помощи предложения OPTION, а также введена более надежная обработка переменных. Синтаксис следующий.

UPDATE {имя_таблицы | имя_представления | набор-строк} [WITH (подсказка!, подсказка2

[, …])] SET {имя_столбца={DEFAULT | NULL | скалярное_выражение} |

имя стременной=скалярное_выражение| имя_переменной=имя_столбца=скалярное_выражение} [, …] [FROM {таблица! |

представление! | вложенная_таблица1 | наборстрок!) [, …]]

[AS псевдоним] [JOIN {таблица2 [, …]}]

WHERE {условия | CURRENT OF [GLOBAL] имя_курсора) [OPTION (подсказка!, подсказка2 [, …])]

Синтаксические элементы инструкции UPDATE в SQL Server следующие.

WITH подсказка

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

имя_переменной

Переменные SQL Server должны быть объявлены до использования инструкции UPDATE, в форме DECLARE @переменная. Конструкция SET @переменная=столбец!=выражение! устанавливает для переменной значение, равное окончательному значению обновленного столбца, а конструкция SET @переменная -столбец!, столбец!=выражение устанавливает для переменной значение, равное значению в столбце до выполнения инструкции UPDATE.

FROM

Предоставляет возможность создать для указания обновляемых строк высокоизбирательный критерий на основе соединения. Предложение FROM не нужно, если при указании строк используется только одна таблица — целевая. Функции для работы с наборами строк (rowset functions) в SQL Server описываются в разделе «Инструкция SELECT».

AS псевдоним

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

JOIN

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

GLOBAL

Небольшая вариация предложения WHERE CURRENT OF стандарта ANSI. Предложение WHERE CURRENT OF имя курсора, используемое в комбинации с курсором, заставляет платформу SQL Server обновить только одну запись, на которой в данный момент расположен курсор. Предполагается, что курсор является локальным, но можно указать и глобальный курсор, используя ключевое слово GLOBAL.

OPTION подсказка

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

Главное расширение, которое вводит Microsoft SQL Server в инструкцию UPDATE стандарта ANSI, — это предложение FROM. Предложение FROM позволяет использовать предложение JOIN, что значительно упрощает обновление строк целевой таблицы путем связывания строк, указанных в предложении FROM, со строками, обновляемыми компонентом UPDATE имя_таблицы. В следующем примере показано обновление результата соединения таблиц с использованием стиля ANSI и довольно громоздкого подзапроса, а потом — обновление с использованием предложения FROM SQL Server. Оба запроса выполняют одно и то же действие, но совершенно по-разному.

Выполнение такого обновления при использовании стиля Transact-SQL сводится к соединению двух таблиц — authors и titleauthor — с таблицей titles. Для выполнения той же самой операции с использованием кода ANSI нужно сначала найти значение au_id в таблице authors и передать его в таблицу titleauthor, а затем нужно найти значение title_id и передать его в основную инструкцию UPDATE.

В следующем примере обновляется столбец state для первых десяти записей таблицы authors.

UPDATE authors SET state=’ZZ’
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id=t1.au_.id

В этом примере важно обратить внимание на то, что, как правило, довольно сложно обновить первые п записей при помощи инструкции UPDATE, если нет какой-нибудь явной последовательности строк, которую можно определить при помощи предложения WHERE. Однако вложенный табличный подзапрос в предложении FROM, использующий ключевое слово ТОР для получения первых 10 записей, помогает не тратить силы на дополнительное программирование, которое иначе было бы необходимо.

Источник