Перейти к содержимому

Как записать результат запроса в переменную sql

  • автор:

SELECT @local_variable (Transact-SQL)

Для присваивания переменных рекомендуется использовать инструкцию SET SET @local_variable вместо SELECT @local_variable.

Синтаксис

SELECT < @local_variable < = | += | -= | *= | /= | %= | &= | ^= | |= >expression > [ . n ] [ ; ] 

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

Аргументы

@local_variable

Объявленная переменная, которой должно быть присвоено значение.

< >= | += | -= | *= | /= | %= | &= | ^= | |=
Присвоить значение справа переменной слева.

Составной оператор присваивания:

Оператор Действие
= Присваивает следующее за ним выражение переменной.
+= Сложение и присваивание
-= Вычитание и присваивание
*= Умножение и присваивание
/= Деление и присваивание
%= Остаток от деления и присваивание
&= Выполнение побитовой операции AND и присваивание
^= Выполнение побитовой операции XOR и присваивание
|= Выполнение побитовой операции OR и присваивание
выражение

Любое допустимое выражение. В их число также входит скалярный вложенный запрос.

Замечания

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

Если инструкция SELECT не возвращает ни одной строки, переменная сохраняет свое текущее значение. Если аргумент expression является скалярным вложенным запросом, который не возвращает значений, переменная принимает значение NULL.

Одна инструкция SELECT может инициализировать несколько локальных переменных.

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

Примеры

А. Используйте инструкцию SELECT @local_variable для возвращения одиночного значения

В следующем примере переменной @var1 присваивается значение «Generic Name» (Обычное имя). Запрос к таблице Store не возвращает строки, потому что в ней отсутствует значение, указанное для CustomerID . Переменная сохраняет значение «Generic Name».

В этом примере используется AdventureWorksLT пример базы данных, чтобы получить дополнительные сведения, см . примеры баз данных AdventureWorks. База AdventureWorksLT данных используется в качестве образца базы данных для База данных SQL Azure.

-- Uses AdventureWorks2022LT DECLARE @var1 VARCHAR(30); SELECT @var1 = 'Generic Name'; SELECT @var1 = [Name] FROM SalesLT.Product WHERE ProductID = 1000000; --Value does not exist SELECT @var1 AS 'ProductName'; 
ProductName ------------------------------ Generic Name 

B. Используйте инструкцию SELECT @local_variable для возвращения значения NULL

В следующем примере вложенный запрос используется для присвоения значения @var1 . Так как запрошенное для CustomerID значение не существует, вложенный запрос не возвращает значение и переменная принимает значение NULL .

В этом примере используется AdventureWorksLT пример базы данных, чтобы получить дополнительные сведения, см . примеры баз данных AdventureWorks. База AdventureWorksLT данных используется в качестве образца базы данных для База данных SQL Azure.

-- Uses AdventureWorksLT DECLARE @var1 VARCHAR(30); SELECT @var1 = 'Generic Name'; SELECT @var1 = (SELECT [Name] FROM SalesLT.Product WHERE ProductID = 1000000); --Value does not exist SELECT @var1 AS 'Company Name'; 
Company Name ---------------------------- NULL 

C. Антишаблоны рекурсивного назначения переменных

Избегайте следующего шаблона рекурсивного использования переменных и выражений:

SELECT @Var = FROM . 

В этом случае обновление @Var строка за строкой не гарантируется. Например, для @Var может быть задано начальное значение @Var во всех строках. Такое происходит потому, что порядок и частота обработки назначений являются недетерминированными. Это относится к выражениям, содержащим объединение строк переменных, как показано ниже, а также к выражениям с нестроковыми переменными или операторами в стиле +=. Вместо построчных операций используйте для наборов данных функции агрегирования.

Для объединения строк вместо этого рассмотрим STRING_AGG функцию, представленную в SQL Server 2017 (14.x), для сценариев, в которых требуется упорядоченное объединение строк. Дополнительные сведения см. в статье STRING_AGG (Transact-SQL).

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

В следующем примере при попытке упорядочить объединение с помощью ORDER BY список оказывается неполным. Старайтесь так не делать:

DECLARE @List AS nvarchar(max); SELECT @List = CONCAT(COALESCE(@List + ', ',''), p.LastName) FROM Person.Person AS p WHERE p.FirstName = 'William' ORDER BY p.BusinessEntityID; SELECT @List; 
(No column name) --- Walker 

Вместо этого попробуйте:

DECLARE @List AS nvarchar(max); SELECT @List = STRING_AGG(p.LastName,', ') WITHIN GROUP (ORDER BY p.BusinessEntityID) FROM Person.Person AS p WHERE p.FirstName = 'William'; SELECT @List; 
(No column name) --- Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker 

См. также

  • DECLARE @local_variable (Transact-SQL)
  • Выражения (Transact-SQL)
  • Составные операторы (Transact-SQL)
  • SELECT (Transact-SQL)

Следующие шаги

Как записать результат запроса в переменную sql

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

SELECT @переменная_1 = спецификация_столбца_1, @переменная_2 = спецификация_столбца_2, . @переменная_N = спецификация_столбца_N

Кроме того, в выражении SET значение, присваиваемое переменной, также может быть результатом команды SELECT.

Например, пусть у нас будут следующие таблицы:

CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );

Используем переменные при извлечении данных:

DECLARE @maxPrice MONEY, @minPrice MONEY, @dif MONEY, @count INT SET @count = (SELECT SUM(ProductCount) FROM Orders); SELECT @minPrice=MIN(Price), @maxPrice = MAX(Price) FROM Products SET @dif = @maxPrice - @minPrice; PRINT 'Всего продано: ' + STR(@count, 5) + ' товарa(ов)'; PRINT 'Разница между максимальной и минимальной ценой: ' + STR(@dif)

В данном случае переменная @count будет содержать сумму всех значений из столбца ProductCount таблицы Orders, то есть общее количество проданных товаров.

Переменные @min и @max хранят соответственно минимальное и максимальное значения столбца Price из таблицы Products, а переменная @dif — разницу между этими значениями. И подобно простым значениям, переменные также могут участвовать в операциях.

Переменные в запросах в T-SQL

DECLARE @sum MONEY, @id INT, @prodid INT, @name NVARCHAR(20); SET @id=2; SELECT @sum = SUM(Orders.Price*Orders.ProductCount), @name=Products.ProductName, @prodid = Products.Id FROM Orders INNER JOIN Products ON ProductId = Products.Id GROUP BY Products.ProductName, Products.Id HAVING Products.Id=@id PRINT 'Товар ' + @name + ' продан на сумму ' + STR(@sum)

Здесь извлекаемые данные из двух таблиц Products и Orders группируются по столбцам Id и ProductName из таблицы Products. Затем данные фильтруются по столбцу Id из Products. А извлеченные данные попадают в переменные @sum, @name, @prodid.

Можно ли присвоить переменной результат запроса?SQL,TRANSACT-SQL

При этом одним запросом можно присвоить значения нескольким переменным:

select @i1 = i1, @i2 = i2, . from . 

Отслеживать
ответ дан 30 авг 2013 в 9:44
11.5k 16 16 серебряных знаков 16 16 бронзовых знаков

Запрос нужно обернуть в скобки. То есть

DECLARE @enddate INT; SET @enddate = (SELECT dbo.Date_Dim.ID FROM dbo.Date_Dim WHERE dbo.Date_Dim.DateOper = '2013-06-27'); 

ну и позаботиться о том, чтобы он возвращал только одно значение, если это не так

Отслеживать
ответ дан 30 авг 2013 в 7:11
DreamChild DreamChild
36.2k 3 3 золотых знака 45 45 серебряных знаков 85 85 бронзовых знаков
да,спасибо,топ 1 уже поставил
30 авг 2013 в 7:12

в mysql можно не объявлять переменную, а сразу воспользоваться ей

 set @m = (SELECT MIN(id) FROM db.table WHERE status=0); UPDATE db.table SET status=1 WHERE select * from db.table ; 

Отслеживать
ответ дан 23 мая 2017 в 14:36
101 1 1 бронзовый знак

  • sql-server
  • sql
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как записать результат запроса в переменную sql

Для создания сложных запросов, выполняемых в несколько этапов, в SQL предусмотрены переменные.

В переменных могут сохраняться результаты вычисления встроенных функций и констант.

Для использования переменной, ее надо предварительно « объявить » , выполнив команду DECLARE языка SQL. Команда DECLARE имеет следующий формат: DECLARE , где — это название объявляемой переменной, а — тип данных, хранимых в ней. Названия переменных начинаются с символа « @ » , после которого могут использоваться буквы латинского алфавита, цифры и знаки « @ » , « $ » , « % » , « & » , « ~ » , « _ » .

Поддерживаются следующие основные типы данных:

  • Geometry — пространственный объект;
  • BigInt — целочисленное значение в диапазоне от -2 63 -1 до 2 63 (от — 9,223,372,036,854,775,808 по +9,223,372,036,854,775,807 );
  • Int — целочисленное значение в диапазоне от -2 31 ( -2,147,483,648 ) to 2 31 -1 ( 2,147,483,647 );
  • SmallInt — целочисленное значение в диапазоне от -2 15 ( -32,768 ) to 2 15 -1 ( 32,767 );
  • Double , Float , Real — число с плавающей точкой;
  • char , varchar — строковое значение.

Переменным можно присваивать только значения соответствующего типа данных. Для задания значения переменной используется команда SET языка SQL, имеющая формат SET = , где — выражение составленное из числовых и строковых функций и констант, соединенных знаками сложения, вычитания, умножения и деления, и сгруппированных с помощью скобок.

Использование переменных

DECLARE @i Int; SET @i = 2+2; SELECT @i*3

В примере объявляется переменная @g типа Int . Для переменной задается значение — результат вычисления выражения 2+2 , после чего значение переменной умноженной на 3 выводится в область ответа с помощью ключевого слова SELECT .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *