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

определение

Начинается с @

Время жизни: с момента объявления до конца выполнения процедуры, где объявлена, или батча

Инструкция DECLARE инициализирует переменную Transact-SQL следующими значениями:

  • Назначение имени. Первым символом имени должен быть одиночный символ @.
  • Назначение длины и типа данных, определяемого системой или пользователем. Для числовых переменных задаются также точность и масштаб. Для переменных типа XML может быть назначена необязательная коллекция схем.
  • Задание значения NULL.

Например, следующая DECLARE инструкция создает локальную переменную @mycounter с типом данных int . По умолчанию значение этой переменной равно NULL.

DECLARE @MyCounter INT;
DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);

Будет ошибка

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

Чтобы назначить значение переменной, используйте инструкцию SET

USE AdventureWorks2022;
GO
 
-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
    @PostalCodeVariable NVARCHAR(15);
 
-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';
 
-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
    FirstName,
    JobTitle,
    City,
    StateProvinceName,
    CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
    OR PostalCode = @PostalCodeVariable;
GO

Можно вот так:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;
 
SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO

Неочевидно: Если инструкция возвращает несколько строк и переменная ссылается на нескаларовое SELECT выражение, переменная задается значением, возвращаемым для выражения в последней строке результирующий набор.

Использование

  • Счетчики
  • Фильтры

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

Глобальные переменные начинаются с двух символов @@ (хотя в документации они называются функциями)

Лучше не использовать, может быть конфликт имен. Есть системные функции:

  • @@SERVERNAME – содержит имя экземпляра MS SQL Server;
  • @@VERSION – информация о версии SQL Server;
  • @@ROWCOUNT – содержит количество строк, обработанных последней выполненной командой;
  • @@SPID – идентификатор текущего процесса;
  • @@TRANCOUNT – уровень вложенности транзакций;
  • @@NESTLEVEL – уровень вложенности при выполнении хранимых процедур и триггеров;
  • @@OPTIONS – текущие настройки серверных параметров;
  • @@ERROR – содержит код ошибки последней выполненной команды;
  • @@IDENTITY – последнее значение счетчика, которое было использовано после добавления строки. имба
  • @@CURSOR_ROWS – возвращает количество записей, полученных последней командой открытия курсора. Получение имени экземпляра:
SELECT @@SERVERNAME