Microsoft SQL Server
переменные
Поиск…
Синтаксис
- DECLARE @VariableName DataType [= Value];
- SET @VariableName = Value;
Объявление переменной таблицы
DECLARE @Employees TABLE
(
EmployeeID INT NOT NULL PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
ManagerID INT NULL
)
Когда вы создаете обычную таблицу, вы используете синтаксис CREATE TABLE Name (Columns)
. При создании переменной таблицы используется DECLARE @Name TABLE (Columns)
.
Чтобы ссылаться на переменную таблицы внутри SELECT
, SQL Server требует, чтобы вы указали переменную таблицы как псевдоним, иначе вы получите сообщение об ошибке:
Должен объявить скалярную переменную «@TableVariableName».
т.е.
DECLARE @Table1 TABLE (Example INT)
DECLARE @Table2 TABLE (Example INT)
/*
-- the following two commented out statements would generate an error:
SELECT *
FROM @Table1
INNER JOIN @Table2 ON @Table1.Example = @Table2.Example
SELECT *
FROM @Table1
WHERE @Table1.Example = 1
*/
-- but these work fine:
SELECT *
FROM @Table1 T1
INNER JOIN @Table2 T2 ON T1.Example = T2.Example
SELECT *
FROM @Table1 Table1
WHERE Table1.Example = 1
Обновление переменной с помощью SET
DECLARE @VariableName INT
SET @VariableName = 1
PRINT @VariableName
1
Используя SET
, вы можете обновлять только одну переменную за раз.
Обновление переменных с помощью SELECT
Используя SELECT
, вы можете обновлять сразу несколько переменных.
DECLARE @Variable1 INT, @Variable2 VARCHAR(10)
SELECT @Variable1 = 1, @Variable2 = 'Hello'
PRINT @Variable1
PRINT @Variable2
1
Привет
При использовании SELECT
для обновления переменной из столбца таблицы, если имеется несколько значений, она будет использовать последнее значение. (Применяются правила нормального порядка - если сортировка не задана, заказ не гарантируется).
CREATE TABLE #Test (Example INT)
INSERT INTO #Test VALUES (1), (2)
DECLARE @Variable INT
SELECT @Variable = Example
FROM #Test
ORDER BY Example ASC
PRINT @Variable
2
SELECT TOP 1 @Variable = Example
FROM #Test
ORDER BY Example ASC
PRINT @Variable
1
Если в запросе нет строк, значение переменной не изменится:
SELECT TOP 0 @Variable = Example
FROM #Test
ORDER BY Example ASC
PRINT @Variable
1
Объявлять сразу несколько переменных с начальными значениями
DECLARE
@Var1 INT = 5,
@Var2 NVARCHAR(50) = N'Hello World',
@Var3 DATETIME = GETDATE()
Операторы вспомогательного присваивания
Поддерживаемые составные операторы:
+=
Добавить и назначить
-=
Вычесть и назначить
*=
Умножить и назначить
/=
Разделить и назначить
%=
Modulo и назначить
&=
Побитовое И и назначить
^=
Побитовое XOR и назначить
|=
Побитовое ИЛИ и назначить
Пример использования:
DECLARE @test INT = 42;
SET @test += 1;
PRINT @test; --43
SET @test -= 1;
PRINT @test; --42
SET @test *= 2
PRINT @test; --84
SET @test /= 2;
PRINT @test; --42
Обновление переменных путем выбора из таблицы
В зависимости от структуры ваших данных вы можете создавать переменные, которые обновляются динамически.
DECLARE @CurrentID int = (SELECT TOP 1 ID FROM Table ORDER BY CreateDate desc)
DECLARE @Year int = 2014
DECLARE @CurrentID int = (SELECT ID FROM Table WHERE Year = @Year)
В большинстве случаев вы захотите убедиться, что ваш запрос возвращает только одно значение при использовании этого метода.