Переменные в SQL Server делятся на два основных типа: локальные и глобальные. Они различаются по области видимости, времени жизни и способу объявления.
Локальные переменные
Характеристики:
- Область видимости: Только в рамках текущего пакета, процедуры или функции
- Время жизни: Существуют только во время выполнения текущей сессии/процедуры
- Синтаксис: Начинаются с символа
@
- Инициализация: Требуют явного объявления перед использованием
Пример объявления и использования:
DECLARE @LocalVariable INT = 10;
DECLARE @CustomerName VARCHAR(100);
SELECT @CustomerName = Name FROM Customers WHERE Id = 1;
PRINT @CustomerName;
Особенности:
- Не сохраняют значения между вызовами хранимых процедур
- Видимы только в текущем соединении
- Автоматически уничтожаются при завершении пакета или процедуры
Глобальные переменные
Характеристики:
- Область видимости: Доступны всем соединениям с сервером
- Время жизни: Существуют в течение всего времени работы сервера
- Синтаксис: Начинаются с символов
@@
- Инициализация: Предопределены системой, нельзя создать свои
Примеры системных глобальных переменных:
SELECT @@VERSION; -- Версия SQL Server
SELECT @@ROWCOUNT; -- Количество обработанных строк
SELECT @@ERROR; -- Код последней ошибки
SELECT @@IDENTITY; -- Последнее значение IDENTITY
SELECT @@SPID; -- Идентификатор текущего процесса
Особенности:
- Только для чтения (кроме некоторых исключений)
- Предоставляют системную информацию
- Не могут быть созданы пользователем
Основные различия
Критерий | Локальные переменные | Глобальные переменные |
Область видимости | Текущий пакет/процедура | Все соединения сервера |
Время жизни | Время выполнения пакета | Время работы сервера |
Синтаксис | Начинаются с @ | Начинаются с @@ |
Инициализация | Пользовательские | Системные (предопределенные) |
Изменяемость | Могут изменяться | Большинство только для чтения |
Количество | Не ограничено | Фиксированный набор |
Практическое применение
Когда использовать локальные переменные:
- Для временного хранения результатов вычислений
- Как параметры в хранимых процедурах
- Для накопления данных в циклах
- Для улучшения читаемости сложных запросов
Когда использовать глобальные переменные:
- Для получения системной информации
- Для отладки и логирования
- Для проверки состояния сервера
- Для обработки ошибок
Пример совместного использования
DECLARE @CurrentDate DATETIME = GETDATE();
DECLARE @ServerVersion NVARCHAR(100) = @@VERSION;
PRINT 'Текущая дата: ' + CONVERT(VARCHAR, @CurrentDate, 104);
PRINT 'Версия сервера: ' + @ServerVersion;
PRINT 'Количество активных соединений: ' + CAST(@@CONNECTIONS AS VARCHAR);
Ограничения и рекомендации
-
Локальные переменные:
- Максимальная длина имени - 128 символов
- Нельзя использовать в DDL-запросах напрямую
- Инициализируются NULL, если значение не задано
-
Глобальные переменные:
- Не все переменные поддерживаются во всех версиях SQL Server
- Некоторые переменные (как @@IDENTITY) могут быть изменены системой
- Значения могут изменяться между вызовами
Распространенные ошибки
- Попытка использовать локальную переменную за пределами ее области видимости
BEGIN
DECLARE @TempVar INT = 5;
END
PRINT @TempVar; -- Ошибка: переменная не существует
- Попытка создать пользовательскую глобальную переменную
DECLARE @@MyGlobalVar INT = 10; -- Ошибка: нельзя создавать глобальные переменные
- Использование глобальной переменной как локальной
SELECT @ROWCOUNT; -- Ошибка: должно быть @@ROWCOUNT
Резюмируем
-
Локальные переменные (@var):
- Объявляются пользователем
- Видимы в текущей области
- Используются для временных вычислений
-
Глобальные переменные (@@var):
- Системные, только для чтения
- Предоставляют информацию о сервере
- Общие для всех соединений
Правильное понимание различий между этими типами переменных критически важно для написания эффективного и надежного T-SQL кода.