SET @local_variable (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в 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

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

@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, PRIORRELATIVEи ABSOLUTE. Нельзя указать SCROLL , когда вы также указываете FAST_FORWARD.

FORWARD_ONLY

Указывает, что курсор поддерживает только FETCH NEXT параметр. Курсор извлекается в одном направлении с первой до последней строки. При указании FORWARD_ONLY без STATICKEYSETDYNAMIC ключевое слово курсор реализуется как .DYNAMIC Если вы не указываете или FORWARD_ONLYSCROLLне задаете FORWARD_ONLY значение по умолчанию, если вы не указываете ключевое слово STATIC, KEYSETили DYNAMIC. Для 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.HAVINGUNIONDISTINCT

Если каждая базовая таблица не имеет уникального индекса и курсора 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 в UPDATESELECTоператоре .

Не используйте переменную в операторе SELECT для объединения значений (т. е. для вычисления статистических значений). Непредвиденные результаты запроса могут возникать, так как все выражения в SELECT списке (включая назначения) не обязательно выполняются ровно один раз для каждой выходной строки. Дополнительные сведения см. в КБ 287515.

Разрешения

Требуется членство в роли public. Все пользователи могут использовать SET @local_variable.

Примеры

В этой статье требуется AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества Microsoft SQL Server.

А. Печать значения переменной, инициализированной с помощью SET

Следующий пример создает переменную @myVar, записывает строковое значение в переменную и печатает значение переменной @myVar.

DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO

B. Использование локальной переменной, назначенной значением, с помощью SET в инструкции SELECT

В следующем примере создается локальная переменная с именем @state и используется локальная переменная в SELECT инструкции для поиска имени () и имени семьи (FirstNameLastName) всех сотрудников, живущих в состоянии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

C. Использование составного назначения для локальной переменной

Следующие два примера позволяют получить один и тот же результат. Каждый пример создает локальную переменную с именем @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)

В этой статье требуется AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества 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 инструкции для поиска имени () и имени семьи (FirstNameLastName) всех сотрудников, работающих в отделе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;