Переменные SQL: объявление, установка и выбор переменных в SQL Server.

⚡ Умное резюме

Переменные SQL Server — это именованные объекты, которые служат в качестве заполнителей для одного значения данных в памяти. Перед тем как переменной присвоить значение и использовать её повторно, её необходимо объявить с помощью оператора DECLARE.

  • 📦 Определение: Переменная в SQL Server хранит одно значение и служит в качестве заполнителя для адреса в памяти.
  • ???? Локальный и глобальный: SQL Server поддерживает локальные переменные с префиксом @, объявляемые пользователями, и системные глобальные переменные с префиксом @@.
  • ???? ЗАЯВИТЬ: Оператор DECLARE создает переменную и по умолчанию инициализирует ее значением NULL.
  • 🔀 Три метода назначения: Значение может быть присвоено в операторе DECLARE, с помощью оператора SET или с помощью оператора SELECT.
  • 🔎 Скалярные подзапросы: Операторы SET и SELECT позволяют считывать одно значение из запроса в переменную.
  • ???? SET против SELECT: Оператор SET присваивает значение одной переменной и соответствует стандарту ANSI, тогда как оператор SELECT может присваивать значение нескольким переменным одновременно.

Переменные SQL Server: DECLARE, SET и SELECT

Что такое переменная в SQL Server?

In MS SQL ServerПеременные — это объекты, которые выступают в качестве заполнителей для ячейки памяти. Переменная хранит одно значение данных, которое можно прочитать и повторно использовать в пакете или процедуре.

Типы переменных в SQL: локальные, глобальные

В MS SQL Server есть два типа переменных:

  • Локальная переменная
  • Глобальная переменная

Однако пользователь может создать только локальную переменную. На рисунке ниже показаны два типа переменных, доступных в MS SQL Server.

Диаграмма двух типов переменных в SQL Server: локальные переменные и глобальные переменные.

Локальная переменная

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

Глобальная переменная

  • Система поддерживает глобальную переменную; пользователь не может объявить свою собственную.
  • Имя глобальной переменной начинается с @@.
  • В нём хранится информация, относящаяся к сессии.

Как ОБЪЯВИТЬ переменную в SQL

Перед использованием любой переменной в пакетной обработке или процедуре SQLДля этого необходимо объявить переменную. Команда DECLARE создает переменную, которая служит заполнителем для адреса в памяти. Только после объявления переменную можно использовать в последующей части пакета или процедуры.

Синтаксис TSQL:

DECLARE  { @LOCAL_VARIABLE[AS] data_type  [ = value ] }

Правила:

  • Инициализация при объявлении является необязательной.
  • По умолчанию команда DECLARE инициализирует переменную значением NULL.
  • Использование ключевого слова «AS» не является обязательным.
  • Чтобы объявить более одной локальной переменной, добавьте запятую после первого определения, затем укажите имя следующей переменной и тип данных.

Примеры объявления переменной

Запрос: с «AS»

DECLARE @COURSE_ID AS INT;

Запрос: без «AS»

DECLARE @COURSE_NAME VARCHAR (10);

Запрос: ОБЪЯВИТЬ две переменные

DECLARE @COURSE_ID AS INT, @COURSE_NAME VARCHAR (10);

Присвоение значения переменной SQL

Присвоить значение переменной можно тремя способами:

  • При объявлении переменной с использованием ключевого слова DECLARE.
  • Использование SET.
  • Используя SELECT.

Рассмотрим все три способа подробно.

Во время объявления переменной с использованием ключевого слова DECLARE

Синтаксис T-SQL:

DECLARE { @Local_Variable [AS] Datatype [ = value ] }

Здесь после типа данных можно использовать знак '=', а затем значение, которое нужно присвоить.

Запрос:

DECLARE @COURSE_ID AS INT = 5
PRINT @COURSE_ID

Выполнение запроса выводит значение, присвоенное при объявлении, как показано ниже.

Вывод значения переменной, присвоенной во время объявления переменной, с печатью значения 5.

Использование переменной SQL SET

Иногда требуется разделить объявление и инициализацию. Оператор SET присваивает значение переменной после её объявления. Ниже приведены различные способы присвоения значений с помощью оператора SET.

Пример: Присвоение значения переменной с помощью оператора SET.

Синтаксис:

DECLARE @Local_Variable <Data_Type>
SET @Local_Variable =  <Value>

Запрос:

DECLARE @COURSE_ID AS INT
SET @COURSE_ID = 5
PRINT @COURSE_ID

Выполнение скрипта возвращает значение, присвоенное параметром SET, как показано ниже.

Результат присваивания значения переменной с помощью оператора SET: вывод 5.

Пример: Присвоение значений нескольким переменным с помощью оператора SET.

Синтаксис:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable_2 <Data_Type>,
SET @Local_Variable_1 = <Value_1>
SET @Local_Variable_2 = <Value_2>

Правило: Одно ключевое слово SET может присвоить значение только одной переменной.

Запрос:

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SET @COURSE_ID = 5
SET @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

Оба оператора PRINT возвращают оба присвоенных значения, как показано ниже.

Результат присваивания двух переменных с помощью команды SET: вывод числа 5 и вывод в формате UNIX.

Пример: Присвоение значения переменной с помощью скалярного подзапроса с использованием оператора SET.

Синтаксис:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable_2 <Data_Type>,SET @Local_Variable_1 = (SELECT <Column_1> from <Table_Name> where <Condition_1>)

Правила:

  • Запрос следует заключить в скобки.
  • Запрос должен быть скалярным, то есть возвращать только одну строку и один столбец. В противном случае запрос выдаст ошибку.
  • Если запрос возвращает ноль строк, то переменной присваивается значение EMPTY, то есть NULL.

Предположим, что у нас есть (см. таблицу ниже) названный 'GuruТаблица 99' с двумя столбцами, как показано ниже. Эта таблица используется в следующих примерах.

GuruТаблица 99 со столбцами Tutorial_ID и Tutorial_name, используемая в примерах.

Пример 1: Когда подзапрос возвращает одну строку в результате

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3)
PRINT @COURSE_NAME

Поскольку подзапрос возвращает одну соответствующую строку, переменная получает это значение, как показано ниже.

Результат выполнения скалярного подзапроса, которому присвоен параметр SET, с выводом соответствующего названия учебного пособия.

Пример 2: Когда подзапрос возвращает ноль строк в результате

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

Поскольку подзапрос не возвращает строк, значение переменной равно EMPTY, то есть NULL, поэтому ничего не выводится, как показано ниже.

Результат выполнения скалярного подзапроса типа SET, который не возвращает ни одной строки, оставляя переменную NULL.

Использование переменной SQL SELECT

Подобно оператору SET, оператор SELECT также можно использовать для присвоения значений переменным после их объявления с помощью оператора DECLARE. Ниже приведены различные способы присвоения значения с помощью оператора SELECT.

Пример: Присвоение значения переменной с помощью оператора SELECT.

Синтаксис:

DECLARE @LOCAL_VARIABLE <Data_Type>
SELECT @LOCAL_VARIABLE = <Value>

Запрос:

DECLARE @COURSE_ID INT
SELECT @COURSE_ID = 5
PRINT @COURSE_ID

Оператор присваивания SELECT выводит значение, как показано ниже.

Результат присваивания значения переменной с помощью оператора SELECT: вывод 5

Пример: Присвоение значений нескольким переменным с помощью оператора SELECT.

Синтаксис:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Value_1>,  @Local_Variable _2 = <Value_2>

Правило: В отличие от оператора SET, оператор SELECT позволяет присваивать значения нескольким переменным, разделённым запятыми.

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SELECT @COURSE_ID = 5, @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

Обе переменные присваиваются в одном запросе SELECT, как показано ниже.

Результат присваивания значения двум переменным с помощью одного оператора SELECT: вывод 5 и UNIX.

Пример: Присвоение значения переменной с помощью подзапроса SELECT.

Синтаксис:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = (SELECT <Column_1> from <Table_name> where <Condition_1>)

Правила:

  • Запрос следует заключить в скобки.
  • Запрос должен быть скалярным и возвращать одну строку и один столбец. В противном случае запрос выдаст ошибку.
  • Если запрос возвращает ноль строк, то переменная пуста, то есть имеет значение NULL.

Пересмотрите наши «Guru99-футовый стол.

Пример 1: Когда подзапрос возвращает одну строку в результате

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 1)
PRINT @COURSE_NAME

Подзапрос возвращает одну строку, поэтому переменная хранит это значение, как показано ниже.

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

Пример 2: Когда подзапрос возвращает ноль строк в результате

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

При отсутствии совпадающей строки переменная остается пустой, то есть NULL, как показано ниже.

Результат выполнения скалярного подзапроса SELECT, который не возвращает ни одной строки, оставляя переменную NULL.

Пример 3: Присвоение значения переменной с помощью обычного оператора SELECT.

Синтаксис:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Column_1> from <Table_name> where <Condition_1>

Правила:

  • В отличие от оператора SET, если запрос возвращает несколько строк, то значение переменной устанавливается равным значению последней строки.
  • Если запрос возвращает ноль строк, то переменной присваивается значение EMPTY, то есть NULL.

Запрос 1: Запрос возвращает одну строку.

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 3
PRINT @COURSE_NAME

Единственная совпадающая строка задает значение переменной, как показано ниже.

Результат выполнения обычного оператора SELECT, возвращающего одну строку.

Запрос 2: Запрос возвращает несколько строк.

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99
PRINT @COURSE_NAME

Если совпадает несколько строк, переменная сохраняет значение из последней строки, как показано ниже.

Результат выполнения обычного оператора SELECT, возвращающего несколько строк,ping значение последней строки

Запрос 3: Запрос возвращает ноль строк

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5
PRINT @COURSE_NAME

Если ни одна строка не соответствует условию, переменная становится пустой, то есть NULL, как показано ниже.

Результат выполнения обычного оператора SELECT, не возвращающего ни одной строки, оставляет переменную NULL.

Другие примеры переменных SQL

Объявленная переменная также может использоваться внутри запроса, например, в предложении WHERE для фильтрации строк.

Запрос:

DECLARE @COURSE_ID Int = 1
SELECT * from Guru99 where Tutorial_id = @COURSE_ID

Эта переменная фильтрует запрос и возвращает соответствующую строку, как показано ниже.

Результат использования переменной в предложении WHERE для фильтрации GuruТаблица 99

Интересные факты о переменных SQL Server!

  • Вывести содержимое локальной переменной можно как с помощью команды PRINT, так и с помощью команды SELECT.
  • Тип данных «таблица» не допускает использования 'AS' при объявлении.
  • SET соответствует стандартам ANSI, в то время как SELECT — нет.
  • Допускается также создание локальной переменной с именем @. Например, её можно объявить следующим образом:
'DECLARE @@ as VARCHAR (10)'

Часто задаваемые вопросы (FAQ)

После выполнения оператора DECLARE без присваивания значение переменной SQL Server будет равно NULL. Переменная существует, но не имеет значения, пока вы не присвоите ей значение с помощью оператора DECLARE с операторами =, SET или SELECT. Обращение к ней до присваивания просто вернет NULL.

Если подзапрос не возвращает строк, оператор SET присваивает значение NULL и перезаписывает любое текущее значение. Оператор SELECT, напротив, оставляет переменную без изменений.ping независимо от того, какое значение она уже имела. Эта разница имеет значение, когда переменная изначально имела ненулевое значение.

Табличная переменная, объявленная как DECLARE @t TABLE(…), хранит небольшой набор результатов, ограниченный одним пакетом данных. В отличие от временной таблицы (#temp), она существует только в пределах своего пакета, не может быть изменена после создания и часто подходит для небольших наборов данных.

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

Для работы с переменными можно использовать практически любой SQL Server. тип данныхвключая int, decimal, varchar, nvarchar, date, datetime, bit и table. Сопоставьте переменную с представляемым ею столбцом, чтобы избежать неявных ошибок преобразования.

Присваивайте переменную самой себе с помощью оператора SET, например, SET @counter = @counter + 1. Оператор SELECT тоже работает: SELECT @total = @total + price. Этот шаблон используется для циклов и подсчета накопительных итогов внутри скриптов и хранимых процедур.

Да. Второй пилот GitHub Может генерировать операторы DECLARE, SET и SELECT на основе комментариев на естественном языке и предлагать подходящие типы данных. Всегда проверяйте сгенерированные имена, типы и логику присваивания на соответствие вашей схеме перед запуском в рабочей среде.

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

Подведем итог этой публикации следующим образом: