Инструкции SET (Transact-SQL)
Язык Transact-SQL предоставляет несколько инструкций SET, которые изменяют текущий сеанс, управляя специфическими данными. Инструкции SET группируются в категории, показанные в следующей таблице.
Сведения об установке локальных переменных с помощью инструкции SET см. в разделе SET @local_variable (Transact-SQL).
SET FMTONLY
Примечание. В будущей версии Microsoft SQL Server этот компонент будет удален. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.
SET RESULT SET CACHING (предварительная версия)
Примечание. Эта функция применима только к Azure Synapse Analytics.
SQL SET Keyword
The SET command is used with UPDATE to specify which columns and values that should be updated in a table.
The following SQL updates the first customer (CustomerID = 1) with a new ContactName and a new City:
Example
UPDATE Customers
SET ContactName = ‘Alfred Schmidt’, City= ‘Frankfurt’
WHERE CustomerID = 1;
The following SQL will update the «ContactName» field to «Juan» for all records where Country is «Mexico»:
Example
UPDATE Customers
SET ContactName=’Juan’
WHERE Country=’Mexico’;
Note: Be careful when updating records in a table! Notice the WHERE clause in the UPDATE statement. The WHERE clause specifies which record(s) that should be updated. If you omit the WHERE clause, all records in the table will be updated!
COLOR PICKER


Report Error
If you want to report an error, or if you want to make a suggestion, do not hesitate to send us an e-mail:
Top Tutorials
Top References
Top Examples
Get Certified
W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning.
Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness
of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.
Что такое set в sql
SET — изменить параметр времени выполнения
Синтаксис
SET [ SESSION | LOCAL ]параметр_конфигурации< TO | = ><значение| 'значение' | DEFAULT > SET [ SESSION | LOCAL ] TIME ZONE <значение| 'значение' | LOCAL | DEFAULT >
Описание
Команда SET изменяет конфигурационные параметры времени выполнения. С помощью SET можно «на лету» изменить многие из параметров, перечисленных в Главе 18. (Но для изменения некоторых могут потребоваться права суперпользователя, а другие нельзя изменять после запуска сервера или сеанса.) SET влияет на значение параметра только в рамках текущего сеанса.
Если команда SET (или равнозначная SET SESSION ) выполняется внутри транзакции, которая затем прерывается, эффект команды SET пропадает, когда транзакция откатывается. Если же окружающая транзакция фиксируется, этот эффект сохраняется до конца сеанса, если его не переопределит другая команда SET .
Действие SET LOCAL продолжается только до конца текущей транзакции, независимо от того, фиксируется она или нет. Особый случай представляет использование SET с последующей SET LOCAL в одной транзакции: значение, заданное SET LOCAL , будет сохраняться до конца транзакции, но после этого (если транзакция фиксируется) восстановится значение, заданное командой SET .
Действия SET или SET LOCAL также отменяются при откате к точке сохранения, установленной до выполнения этих команд.
Если SET LOCAL применяется в функции, параметр SET для которой устанавливает значение той же переменной (см. CREATE FUNCTION ), действие команды SET LOCAL прекращается при выходе из функции; то есть, в любом случае восстанавливается значение, существовавшее при вызове функции. Это позволяет использовать SET LOCAL для динамических и неоднократных изменений параметра в рамках функции, и при этом иметь удобную возможность использовать параметр SET для сохранения и восстановления значения, полученного извне. Однако обычная команда SET переопределяет любой параметр SET окружающей функции; её действие сохраняется, если не происходит откат транзакции.
Примечание
В PostgreSQL с версии 8.0 до 8.2 действие SET LOCAL могло отменяться при освобождении ранее установленной точки сохранения или при успешном выходе из блока исключения PL/pgSQL . Затем это поведение было признано неинтуитивным, и было изменено.
Параметры
Указывает, что команда действует в рамках текущего сеанса. (Это поведение по умолчанию, если не указано ни SESSION , ни LOCAL .) LOCAL
Указывает, что команда действует только в рамках текущей транзакции. После COMMIT или ROLLBACK в силу вновь вступает значение, определённое на уровне сеанса. При выполнении такой команды вне блока транзакции выдаётся предупреждение и больше ничего не происходит. параметр_конфигурации
Имя устанавливаемого параметра времени выполнения. Доступные параметры описаны в Главе 18 и ниже. значение
Новое значение параметра. Параметры могут задаваться в виде строковых констант, идентификаторов, чисел или списков перечисленных типов через запятую, в зависимости от конкретного параметра. Указание DEFAULT в данном контексте позволяет сбросить параметр к значению по умолчанию (то есть, к тому значению, которое он имел бы, если в текущем сеансе не выполнялись бы команды SET ).
Помимо конфигурационных параметров, описанных в Главе 18, есть ещё несколько параметров, которые можно изменить только командой SET или которые имеют особый синтаксис:
SET SCHEMA ‘ значение ‘ — альтернативное написание команды SET search_path TO значение . Такой синтаксис позволяет указать только одну схему. NAMES
SET NAMES значение — альтернативное написание команды SET client_encoding TO значение . SEED
Устанавливает внутреннее начальное значение для генератора случайных чисел (функции random ). В качестве значения допускаются числа с плавающей точкой от -1 до 1, для внутреннего применения они затем умножаются на 2 31 -1.
Это начальное значение также можно установить, вызвав функцию setseed :
SELECT setseed(значение);
SET TIME ZONE ‘ значение ‘ — альтернативное написание команды SET timezone TO ‘ значение ‘ . Синтаксис SET TIME ZONE позволяет указывать часовой пояс в специальном формате. Например, допускаются следующие значения:
Часовой пояс Беркли, штат Калифорния. ‘Europe/Rome’
Часовой пояс Италии. -7
Часовой пояс, сдвинутый от UTC на 7 часов к западу (равнозначен PDT). Положительные значения означают сдвиг от UTC к востоку. INTERVAL ‘-08:00’ HOUR TO MINUTE
Часовой пояс, сдвинутый от UTC на 8 часов к западу (равнозначен PST). LOCAL
DEFAULT
Устанавливает в качестве часового пояса местный часовой пояс (то есть, значение серверного параметра timezone по умолчанию).
Значения часового пояса, заданные в виде чисел или интервалов, внутри переводятся в формат часовых поясов POSIX. Например, после SET TIME ZONE -7 , команда SHOW TIME ZONE покажет +07 .
Аббревиатуры часовых поясов команда SET не поддерживает; узнать о часовых поясах подробнее можно в Подразделе 8.5.3.
Замечания
Также изменить значение параметра можно с помощью функции set_config ; см. Раздел 9.26. Кроме того, выполнив UPDATE в системном представлении pg_settings , можно произвести то же действие, что выполняет SET .
Примеры
Установка пути поиска схем:
SET search_path TO my_schema, public;
Установка традиционного стиля даты POSTGRES с форматом ввода « день, месяц, год » :
SET datestyle TO postgres, dmy;
Установка часового пояса для Беркли, штат Калифорния:
SET TIME ZONE 'PST8PDT';
Установка часового пояса Италии:
SET TIME ZONE 'Europe/Rome';
Совместимость
SET TIME ZONE расширяет синтаксис, определённый в стандарте SQL. Стандарт допускает только числовые смещения часовых поясов, тогда как Postgres Pro позволяет задавать часовой пояс более гибко. Все другие функции SET являются расширениями Postgres Pro .
См. также
| Пред. | Наверх | След. |
| SELECT INTO | Начало | SET CONSTRAINTS |
Различия между операторами SET и SELECT при присваивании значений переменным
В SQL Server в языке T-SQL имеется два оператора SET и SELECT, и они оба могут использоваться для присваивания значений переменным. В некоторых ситуациях использование того или иного оператора может привести к неожиданным и непредсказуемым результатам. В этой статье я бы хотел подробно рассмотреть различия между ними и рассказать о различных ловушках, в которые вы можете попасть.
В первую очередь, оба оператора могут равнозначно использоваться для присваивания фиксированных значений переменных. Однако, оператор SET является стандартом для языка SQL, в то время как SELECT является особенностью только T-SQL диалекта в SQL Server.
declare @int_example int, @dt_example datetime, @str_example varchar(255); set @int_example = 1; set @dt_example = getdate(); set @str_example = 'qwe'; select @int_example, @dt_example, @str_example; select @int_example = 1; select @dt_example = getdate(); select @str_example = 'qwe'; select @int_example, @dt_example, @str_example; go
Однако, если мы хотим за одну операцию инициализировать сразу несколько переменных, то необходимо использовать оператор SELECT.
declare @int_example int, @dt_example datetime, @str_example varchar(255); select @int_example = 1, @dt_example = getdate(), @str_example = 'qwe'; select @int_example, @dt_example, @str_example; go
Если же мы попытаемся использовать в данной ситуации SET, то получим ошибку, т.к. он просто не поддерживает такую операцию.
declare @int_example int, @dt_example datetime, @str_example varchar(255); set @int_example = 1, @dt_example = getdate(), @str_example = 'qwe'; select @int_example, @dt_example, @str_example; go
Msg 102, Level 15, State 1, Line 7
Incorrect syntax near ‘,’.
Также оба оператора могут применяться для присваивания значений переменным из таблицы. Однако, если SELECT можно использовать напрямую, то в случае с SET придется все равно использовать SELECT, чтобы получить выборку из таблицы, и уже пытаться ее результаты присвоить переменной.
create table #tmp ( id int not null, int_example int not null, dt_example datetime not null, str_example varchar(255) not null ); insert into #tmp ( id, int_example, dt_example, str_example ) values (1, 1, '19000101', 'qwe'), (2, 2, '19020101', 'qwe2'), (3, 31, '19030101', 'qwe31'), (3, 32, '19030202', 'qwe32'); declare @int_example int, @dt_example datetime, @str_example varchar(255); set @int_example = (select int_example from #tmp where @int_example; select @int_example = int_example from #tmp where @int_example; go
Единственное, необходимо учитывать, что, если результат запроса к таблице вернет больше одного значения, то в случае с операцией SET мы получим ошибку.
create table #tmp ( id int not null, int_example int not null, dt_example datetime not null, str_example varchar(255) not null ); insert into #tmp ( id, int_example, dt_example, str_example ) values (1, 1, '19000101', 'qwe'), (2, 2, '19020101', 'qwe2'), (3, 31, '19030101', 'qwe31'), (3, 32, '19030202', 'qwe32'); declare @int_example int, @dt_example datetime, @str_example varchar(255); set @int_example = (select int_example from #tmp where @int_example; go
Msg 512, Level 16, State 1, Line 25
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, , >= or when the subquery is used as an expression.
В случае же использования оператора SELECT ошибки не возникнет, но в общем случае мы не можем точно предугадать, какое из удовлетворяющих условию выборки значений будет присвоено переменной. Рассмотрим первый случай, в котором запрос вернет 32.
create table #tmp ( id int not null, int_example int not null, dt_example datetime not null, str_example varchar(255) not null ); insert into #tmp ( id, int_example, dt_example, str_example ) values (1, 1, '19000101', 'qwe'), (2, 2, '19020101', 'qwe2'), (3, 31, '19030101', 'qwe31'), (3, 32, '19030202', 'qwe32'); declare @int_example int, @dt_example datetime, @str_example varchar(255); select @int_example = int_example from #tmp where @int_example; go
В следующем случае запрос возвращает 31.
create table #tmp ( id int not null, int_example int not null, dt_example datetime not null, str_example varchar(255) not null ); insert into #tmp ( id, int_example, dt_example, str_example ) values (1, 1, '19000101', 'qwe'), (2, 2, '19020101', 'qwe2'), (3, 32, '19030202', 'qwe32'), (3, 31, '19030101', 'qwe31'); declare @int_example int, @dt_example datetime, @str_example varchar(255); select @int_example = int_example from #tmp where @int_example; go
Как мы сумели убедиться, недетерминированность выборки может приводить к неожиданным результатам. Поэтому в данном случае я бы рекомендовал использовать оператор SET, чтобы как минимум получить ошибку, а также следить за условиями выборки, чтобы не допускать подобных ситуаций.
И еще один момент, на котором я бы хотел остановиться, когда под условия выборки не попадает ни одной записи и при этом значение переменной уже инициализировано каким-либо значением.
create table #tmp ( id int not null, int_example int not null, dt_example datetime not null, str_example varchar(255) not null ); insert into #tmp ( id, int_example, dt_example, str_example ) values (1, 1, '19000101', 'qwe'), (2, 2, '19020101', 'qwe2'), (3, 31, '19030101', 'qwe31'), (3, 32, '19030202', 'qwe32'); declare @int_example int, @dt_example datetime, @str_example varchar(255); set @int_example = 5; set @int_example = (select int_example from #tmp where @int_example; set @int_example = 5; select @int_example = int_example from #tmp where @int_example; go
Как мы можем легко убедиться, оператор SET присвоил значению переменной NULL, а вот оператор SELECT просто проигнорировал присваивание и оставил значение переменной таким, каким оно было этой попытки. В результате, если мы будем использовать оператор SELECT, мы не можем точно знать, было ли проинициализировано значение переменной или нет. Как вариант мы можем проверять значение переменной @@rowcount, которое будет равно нулю, если оператор SELECT не нашел ни одной записи, подходящей под условие и инициализации не произошло.
create table #tmp ( id int not null, int_example int not null, dt_example datetime not null, str_example varchar(255) not null ); insert into #tmp ( id, int_example, dt_example, str_example ) values (1, 1, '19000101', 'qwe'), (2, 2, '19020101', 'qwe2'), (3, 31, '19030101', 'qwe31'), (3, 32, '19030202', 'qwe32'); declare @int_example int, @dt_example datetime, @str_example varchar(255); set @int_example = 5; set @int_example = (select int_example from #tmp where @@rowcount; select @int_example; set @int_example = 5; select @int_example = int_example from #tmp where @@rowcount; select @int_example; go
Подведем итоги, вы можете использовать оба оператора, но должны четко понимать, в какой ситуации и что от них ожидать.
Используйте оператор SET, если:
- Если вы присваиваете фиксированные значения переменным без использования запросов и хотите следовать стандартам.
- Ожидаете, что переменной будет присвоено значение NULL, если запрос не вернул никаких результатов.
- Запрос может вернуть несколько значений, и вы хотите отслеживать такие ситуации.
И используйте оператор SELECT, если:
- Хотите за одну инструкцию присвоить значения сразу нескольким переменным.
- В случае выборки значения из таблицы готовы контролировать, действительно ли произошла инициализация, например, с помощью @@rowcount.
