SET @local_variable (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric
Задает указанную локальную переменную, созданную ранее с помощью DECLARE @local_variable
инструкции, в указанное значение.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server, базы данных SQL Azure или управляемого экземпляра SQL Azure:
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
| { @SQLCLR_local_variable.mutator_method }
| { @local_variable
{ += | -= | *= | /= | %= | &= | ^= | |= } expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ [ LOCAL | GLOBAL ] ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
}
}
}
Синтаксис для Azure Synapse Analytics и параллельного хранилища данных и Microsoft Fabric:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
Аргументы
@local_variable
Имя переменной любого типа, за исключением cursor, text, ntext, image или table. Имена переменных должны начинаться с одного символа (@
). Имена переменных должны соответствовать правилам для идентификаторов.
property_name
Свойство определяемого пользователем типа.
field_name
Общее поле определяемого пользователем типа.
udt_name
Имя определяемого пользователем типа среды CLR.
{ . | :: }
Указывает метод пользовательского типа среды CLR. Для метода экземпляра (нестатическое) используйте период (.
). Для статического метода используйте две двоеточия (::
). Для обращения к методу, свойству или полю определяемого пользователем типа среды CLR необходимо разрешение EXECUTE для этого типа.
method_name ( аргумент [ ,... n ] )
Метод определяемого пользователем типа, который принимает один или несколько аргументов для изменения состояния экземпляра типа. Статические методы должны быть общими.
@SQLCLR_local_variable
Переменная, тип которой находится в сборке. Дополнительные сведения см . в концепциях программирования интеграции среды CLR.
mutator_method
Метод из сборки, который может менять состояние объекта. К этому методу применяется свойство SQLMethodAttribute.IsMutator.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Составной оператор присваивания:
+=
— Добавление и назначение-=
— вычитать и назначать*=
- Умножение и назначение/=
— Деление и назначение%=
- Модуло и назначение&=
- БитовоеAND
и назначение^=
- БитовоеXOR
и назначение|=
- БитовоеOR
и назначение
выражение
Любое допустимое выражение.
cursor_variable
Имя переменной курсора. Если переменная целевого курсора ранее ссылалась на другой курсор, эта ссылка будет удалена.
cursor_name
Имя курсора, объявленного с помощью инструкции DECLARE CURSOR
.
CURSOR
Указывает, что SET
инструкция содержит объявление курсора.
SCROLL
Указывает, что курсор поддерживает все параметры получения: FIRST
, LAST
, , NEXT
, PRIOR
RELATIVE
и ABSOLUTE
. Нельзя указать SCROLL
, когда вы также указываете FAST_FORWARD
.
FORWARD_ONLY
Указывает, что курсор поддерживает только FETCH NEXT
параметр. Курсор извлекается в одном направлении с первой до последней строки. При указании FORWARD_ONLY
без STATIC
KEYSET
ключевых слов курсор DYNAMIC
реализуется как DYNAMIC
. Если вы не указываете или SCROLL
не указываете значение по умолчанию, если вы не укажет FORWARD_ONLY
ключевые слова STATIC
илиKEYSET
DYNAMIC
. FORWARD_ONLY
Для STATIC
, KEYSET
а DYNAMIC
курсоры SCROLL
— это значение по умолчанию.
STATIC
Определяет курсор, который создает временную копию данных для использования курсором. Все запросы к курсору отвечают из этой временной таблицы.tempdb
Поэтому изменения, внесенные в базовые таблицы после открытия курсора, не влияют на данные, возвращенные операциями получения, которые выполняются для курсора. Кроме того, этот курсор не поддерживает изменения.
KEYSET
Указывает, что членство или порядок строк в курсоре неизменны при его открытии. Набор ключей, однозначно определяющих строки, встроен в ключи tempdb
. Изменения на неключевые значения в базовых таблицах, либо созданных владельцем курсора, либо зафиксированных другими пользователями, видны при прокрутке владельцем курсора содержимого курсора. Вставки, выполненные другими пользователями, не отображаются. Кроме того, невозможно выполнить вставку с помощью серверного курсора Transact-SQL.
Если строка удаляется, попытка получить строку возвращает значение @@FETCH_STATUS
-2
. Обновление значений ключа из-за границ курсора аналогично удалению старой строки с последующей вставкой новой строки. Строка с новыми значениями не отображается и пытается получить строку со старыми значениями @@FETCH_STATUS
-2
. Новые значения видны, если обновление происходит через курсор, указав WHERE CURRENT OF
предложение.
DYNAMIC
Определяет курсор, который отражает все изменения данных в строках в его результирующем наборе по мере того, как владелец курсора осуществляет прокрутку по курсору. Значения данных, порядок и членство строк в каждой выборке могут меняться. Динамические курсоры не поддерживают параметры абсолютного и относительного получения.
FAST_FORWARD
Указывает FORWARD_ONLY
курсор READ_ONLY
с включенными оптимизациями. FAST_FORWARD
нельзя указать, если SCROLL
также указано.
READ_ONLY
Предотвращает внесение изменений через этот курсор. Курсор нельзя ссылаться в предложении WHERE CURRENT OF
в инструкции или DELETE
инструкцииUPDATE
. Этот параметр имеет преимущество над установленной по умолчанию возможностью обновления курсора.
SCROLL LOCKS
Указывает, что позиционированные обновления или удаления, осуществляемые с помощью курсора, гарантированно будут выполнены успешно. SQL Server блокирует строки по мере их чтения в курсор, чтобы гарантировать их доступность для последующих изменений. Нельзя указать SCROLL_LOCKS
, когда FAST_FORWARD
также указано.
OPTIMISTIC
Указывает, что позиционированные обновления или удаления, осуществляемые с помощью курсора, не будут выполнены, если с момента считывания в курсор строка была обновлена. SQL Server не блокирует строки по мере их чтения в курсор. Вместо этого используются сравнения значений столбца timestamp или значений контрольных сумм, если в таблице нет столбца timestamp, чтобы определить факт изменения строки после ее считывания в курсор. Если строка была изменена, то попытки позиционированного обновления или удаления будут безрезультатными. Нельзя указать OPTIMISTIC
, когда FAST_FORWARD
также указано.
TYPE_WARNING
Указывает, что клиенту будет отправлено предупреждение, если курсор неявно будет преобразован из одного запрашиваемого типа в другой.
FOR select_statement
Стандартная SELECT
инструкция, определяющая результирующий набор курсора. Ключевые FOR BROWSE
слова и INTO
не допускаются в select_statement объявления курсора.
Если вы используете , GROUP BY
или включаете агрегатное выражение в select_list, курсор создается как STATIC
.HAVING
UNION
DISTINCT
Если каждая базовая таблица не имеет уникального индекса и курсора ISO SCROLL
или запрашивается курсор Transact-SQL KEYSET
, курсор автоматически является курсором STATIC
.
Если select_statement содержит ORDER BY
предложение, в котором столбцы не являются уникальными идентификаторами строк, DYNAMIC
курсор преобразуется в KEYSET
курсор или STATIC
в курсор, если KEYSET
курсор не может быть открыт. Этот процесс также выполняется для курсора, определенного с помощью синтаксиса ISO, но без ключевого STATIC
слова.
READ ONLY
Предотвращает внесение изменений через этот курсор. Курсор нельзя ссылаться в предложении WHERE CURRENT OF
в инструкции или DELETE
инструкцииUPDATE
. Этот параметр имеет преимущество над установленной по умолчанию возможностью обновления курсора. Это ключевое слово отличается от предыдущего READ_ONLY
, используя пробел вместо подчеркивания между READ
и ONLY
.
UPDATE [ OF COLUMN_NAME [ ,... n ] ]
Определяет обновляемые столбцы в курсоре. Если OF <column_name> [ , ...n ]
определено, только перечисленные столбцы позволяют вносить изменения. Если список не указан, все столбцы можно обновить, если курсор не определен как READ_ONLY
.
Замечания
После объявления переменной инициализируется NULL
в . Используйте инструкцию SET
, чтобы назначить значение, которое не NULL
является объявленной переменной. Инструкция SET
, которая назначает значение переменной, возвращает одно значение. При инициализации нескольких переменных используйте отдельную SET
инструкцию для каждой локальной переменной.
Вы можете использовать переменные только в выражениях, но не вместо имен объектов или ключевых слов. Чтобы создать динамические инструкции Transact-SQL, используйте EXECUTE
.
Хотя правила синтаксиса для SET @cursor_variable
включения LOCAL
ключевых слов и GLOBAL
ключевых слов, при использовании синтаксиса SET @cursor_variable = CURSOR...
курсор создается как GLOBAL
или LOCAL
, в зависимости от параметра локальной базы данных курсора по умолчанию.
Переменные курсора всегда локальные, даже если ссылаются на глобальный курсор. Если переменная курсора ссылается на глобальный курсор, курсор имеет ссылки как на глобальный, так и на локальный курсоры. Дополнительные сведения см. в разделе "Пример D", использование SET с глобальным курсором.
Дополнительные сведения см. в разделе DECLARE CURSOR (Transact-SQL).
Оператор составного назначения можно использовать в любом месте назначения с выражением справа от оператора, включая переменные, а также SET
в операторе , а также RECEIVE
в UPDATE
SELECT
операторе .
Не используйте переменную в операторе SELECT
для объединения значений (т. е. для вычисления статистических значений). Непредвиденные результаты запроса могут возникать, так как все выражения в SELECT
списке (включая назначения) не обязательно выполняются ровно один раз для каждой выходной строки. Дополнительные сведения см. в 287515 базы знаний.
Разрешения
Требуется членство в роли public. Все пользователи могут использовать SET @local_variable
.
Примеры
Примеры кода Transact-SQL в этой статье используют AdventureWorks2022
базу данных или AdventureWorksDW2022
пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.
А. Печать значения переменной, инициализированной с помощью SET
Следующий пример создает переменную @myVar
, записывает строковое значение в переменную и печатает значение переменной @myVar
.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. Использование локальной переменной, назначенной значением, с помощью SET в инструкции SELECT
В следующем примере создается локальная переменная с именем @state
и используется локальная переменная в SELECT
инструкции для поиска имени () и имени семьи (FirstName
LastName
) всех сотрудников, живущих в состоянииOregon
.
USE AdventureWorks2022;
GO
DECLARE @state CHAR(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
GO
В. Использование составного назначения для локальной переменной
Следующие два примера позволяют получить один и тот же результат. Каждый пример создает локальную переменную с именем @NewBalance
, умножает ее 10
на, а затем отображает новое значение локальной переменной в инструкции SELECT
. Во втором примере используется составной оператор присваивания.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
GO
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
GO
D. Использование SET с глобальным курсором
Следующий пример создает локальную переменную и устанавливает переменную курсора в значение имени глобального курсора.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
GO
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
Е. Определение курсора с помощью SET
Следующий пример использует инструкцию SET
для определения курсора.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2022.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
GO
F. Назначение значения из запроса
Следующий пример использует запрос для присваивания значения переменной.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. Назначение значения переменной определяемого пользователем типа путем изменения свойства типа
В следующем примера устанавливается значение для определяемого пользователем типа Point
путем изменения значения свойства типа X
.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Узнайте подробнее о создании Point
, на который ссылается UDT в этом примере и в следующих примерах в разделе Создание определяемых пользователем типов.
H. Назначение значения определяемой пользователем переменной типа путем вызова метода типа
Следующий пример устанавливает значение определяемого пользователем типа point путем вызова метода SetXY
типа.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. Создание переменной для типа СРЕДЫ CLR и вызов метода мутатора
В следующем примере создается переменная для типа Point
, а затем выполняется метод мутатора в Point
.
CREATE ASSEMBLY mytest FROM 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
Примеры кода Transact-SQL в этой статье используют AdventureWorks2022
базу данных или AdventureWorksDW2022
пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.
J. Печать значения переменной, инициализированной с помощью SET
Следующий пример создает переменную @myVar
, записывает строковое значение в переменную и печатает значение переменной @myVar
.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
K. Использование локальной переменной, назначенной значением, с помощью SET в инструкции SELECT
В следующем примере создается локальная переменная с именем @dept
и используется эта локальная переменная в SELECT
инструкции для поиска имени () и имени семьи (FirstName
LastName
) всех сотрудников, работающих в отделеMarketing
.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
L. Использование составного назначения для локальной переменной
Следующие два примера позволяют получить один и тот же результат. Они создают локальную переменную с именем @NewBalance
, умножают ее на 10
и отображают новое значение локальной переменной в инструкции SELECT
. Во втором примере используется составной оператор присваивания.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
M. Назначение значения из запроса
Следующий пример использует запрос для присваивания значения переменной.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;