Что такое локальные и глобальные переменные и их различия?sql-60

Переменные в SQL Server делятся на два основных типа: локальные и глобальные. Они различаются по области видимости, времени жизни и способу объявления.

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

Характеристики:

  1. Область видимости: Только в рамках текущего пакета, процедуры или функции
  2. Время жизни: Существуют только во время выполнения текущей сессии/процедуры
  3. Синтаксис: Начинаются с символа @
  4. Инициализация: Требуют явного объявления перед использованием

Пример объявления и использования:

DECLARE @LocalVariable INT = 10;
DECLARE @CustomerName VARCHAR(100);

SELECT @CustomerName = Name FROM Customers WHERE Id = 1;

PRINT @CustomerName;

Особенности:

  • Не сохраняют значения между вызовами хранимых процедур
  • Видимы только в текущем соединении
  • Автоматически уничтожаются при завершении пакета или процедуры

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

Характеристики:

  1. Область видимости: Доступны всем соединениям с сервером
  2. Время жизни: Существуют в течение всего времени работы сервера
  3. Синтаксис: Начинаются с символов @@
  4. Инициализация: Предопределены системой, нельзя создать свои

Примеры системных глобальных переменных:

SELECT @@VERSION;        -- Версия SQL Server
SELECT @@ROWCOUNT;       -- Количество обработанных строк
SELECT @@ERROR;          -- Код последней ошибки
SELECT @@IDENTITY;       -- Последнее значение IDENTITY
SELECT @@SPID;           -- Идентификатор текущего процесса

Особенности:

  • Только для чтения (кроме некоторых исключений)
  • Предоставляют системную информацию
  • Не могут быть созданы пользователем

Основные различия

КритерийЛокальные переменныеГлобальные переменные
Область видимостиТекущий пакет/процедураВсе соединения сервера
Время жизниВремя выполнения пакетаВремя работы сервера
СинтаксисНачинаются с @Начинаются с @@
ИнициализацияПользовательскиеСистемные (предопределенные)
ИзменяемостьМогут изменятьсяБольшинство только для чтения
КоличествоНе ограниченоФиксированный набор

Практическое применение

Когда использовать локальные переменные:

  1. Для временного хранения результатов вычислений
  2. Как параметры в хранимых процедурах
  3. Для накопления данных в циклах
  4. Для улучшения читаемости сложных запросов

Когда использовать глобальные переменные:

  1. Для получения системной информации
  2. Для отладки и логирования
  3. Для проверки состояния сервера
  4. Для обработки ошибок

Пример совместного использования

DECLARE @CurrentDate DATETIME = GETDATE();
DECLARE @ServerVersion NVARCHAR(100) = @@VERSION;

PRINT 'Текущая дата: ' + CONVERT(VARCHAR, @CurrentDate, 104);
PRINT 'Версия сервера: ' + @ServerVersion;
PRINT 'Количество активных соединений: ' + CAST(@@CONNECTIONS AS VARCHAR);

Ограничения и рекомендации

  1. Локальные переменные:

    • Максимальная длина имени - 128 символов
    • Нельзя использовать в DDL-запросах напрямую
    • Инициализируются NULL, если значение не задано
  2. Глобальные переменные:

    • Не все переменные поддерживаются во всех версиях SQL Server
    • Некоторые переменные (как @@IDENTITY) могут быть изменены системой
    • Значения могут изменяться между вызовами

Распространенные ошибки

  1. Попытка использовать локальную переменную за пределами ее области видимости
BEGIN
    DECLARE @TempVar INT = 5;
END
PRINT @TempVar; -- Ошибка: переменная не существует
  1. Попытка создать пользовательскую глобальную переменную
DECLARE @@MyGlobalVar INT = 10; -- Ошибка: нельзя создавать глобальные переменные
  1. Использование глобальной переменной как локальной
SELECT @ROWCOUNT; -- Ошибка: должно быть @@ROWCOUNT

Резюмируем

  1. Локальные переменные (@var):

    • Объявляются пользователем
    • Видимы в текущей области
    • Используются для временных вычислений
  2. Глобальные переменные (@@var):

    • Системные, только для чтения
    • Предоставляют информацию о сервере
    • Общие для всех соединений

Правильное понимание различий между этими типами переменных критически важно для написания эффективного и надежного T-SQL кода.