Skip to content

Переменные SQL в скриптах, функциях, хранимых процедурах, SQLCMD и т.д.

Пересказ статьи Daniel Calbimonte. SQL Variables in Scripts, Functions, Stored Procedures, SQLCMD and More


Как и в любых языках разработки, использование переменных для хранения значений переменных в коде также весьма полезно при работе с СУБД Microsoft SQL Server. Здесь мы рассмотрим различные способы использования переменных при написании кода T-SQL, использовании SSIS, скриптов и т.п.
Мы рассмотрим следующие вопросы, относящиеся к переменным Transact-SQL в SQL Server:

  • Что такое переменные?

  • Что такое типы переменных?

  • Как объявить переменную?

  • Как установить переменную?

  • Зачем использовать переменные?

  • Как использовать переменные в хранимых процедурах?

  • Как использовать переменные в функциях?

  • Как использовать переменные с SQLCMD?

  • Как использовать переменные в скриптах?

  • Как использовать переменные с SSIS?

Что такое переменные?


Переменная - это значение, которое может динамически меняться в программе. Переменные могут иметь различные типы данных и использоваться в базах данных SQL для придания большей гибкости операторам SQL вместо значений жесткого кодирования, которые постоянно меняются.

Что такое типы переменных?


Переменные могут использоваться для следующих случаев (типов):

  • Числовые (int, smallint, money, decimal, bigint, numeric, bit, smallmoney, tinyint, float, real)

  • Дата и/или время (date, datetime2, datetime, datetimeoffset, smalldatetime, time)

  • Символы (char, varchar, text, nchar, nvarchar и ntext)

  • Двоичные типы данных, например, image

  • XML

  • sql_variant, который может поддерживать различные типы данных

  • Uniqueidentifier

  • Переменные пространственной геометрии и пространственной географии

  • Курсоры

  • Предложение WHERE

  • а также табличные переменные


Как объявить переменную SQL?


Базовый синтаксис объявления переменной следующий:

DECLARE @имя_переменной тип_данных

Для объявления переменной необходимо использовать слово DECLARE, после чего указать имя с префиксом @ и тип данных.

В следующем примере показано, как объявить переменную типа smallint.

DECLARE @myvariable smallint

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

DECLARE @myvariable smallint = 2
SELECT CONCAT('The variable value is', SPACE(1), @myvariable) as myvariable

Вот результат:



Следующий пример объявляет переменную @mytext типа varchar и присваивает ей значение Hello.

DECLARE @mytext nvarchar = 'Hello'
SELECT @mytext message



Обратите внимание, что результат отображает только первую букву слова Hello. Это происходит потому, что значением по умолчанию типа данных nvarchar или varchar является единственный символ. Если вам нужно больше символов, укажите длину. Следующий пример использует длину 10 символов.

DECLARE @mytext nvarchar(10) = 'Hello'
SELECT @mytext message



Следующий пример показывает, как объявить переменную типа даты и присвоить ей значение. Затем мы отображаем дату в формате dd-MM-yyyy.

DECLARE @mydate datetime = '2020-01-01 5:00:00'
SELECT FORMAT(@mydate, 'dd-MM-yyyy') message



Как установить значение переменной SQL?


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

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

DECLARE @mydecimal decimal(10,5)
SELECT @mydecimal = 89.9899
SELECT @mydecimal message

Второй пример присваивает значение непосредственно в операторе DECLARE, как в примерах выше.

DECLARE @mydecimal decimal(10,5) = 89.9899
SELECT @mydecimal message

Третий пример показывает как объявить переменную, а затем присвоить ей значение с помощью оператора SET во второй строке кода.

DECLARE @mydecimal decimal(10,5)
SET @mydecimal = 89.9899
SELECT @mydecimal message

Результаты для всех трех примеров будут одинаковы.



Географические переменные


SQL Server имеет геопространственные типы данных, и в следующем примере мы объявляем географическую переменную с именем location, и присваиваем ей значения.

DECLARE @Location GEOGRAPHY 
SET @Location = geography::STGeomFromText('LINESTRING(47.653 -89.358, 48.1 -89.320, 49.0 -88.28)', 4326)
SELECT @Location

Ниже показан результат.



Чтобы больше узнать о типах данных Geography и Geometry, обратитесь к следующей статье.

Табличные переменные


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

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

DECLARE @TestTable TABLE
(
ID INT,
Name NVARCHAR(40)
)
INSERT INTO @TestTable values(1,'John')
SELECT * from @TestTable



Более подробно о табличных переменных вы можете прочитать в статье.

Зачем использовать переменные SQL?


Переменные в T-SQL позволяют создавать интеллектуальный и динамичный код. Это дает больше возможностей пользователю для получения информации удобным способом, автоматизировать задачи и повторно использовать код. Все языки программирования используют переменные, и T-SQL не является исключением.

Как использовать переменные в хранимых процедурах?


Хранимые процедуры очень популярны в SQL Server. Они используются чаще, чем функции, во многом благодаря своей гибкости и простоте использования.

В следующем примере показывается, как создать хранимую процедуру с именем dbo.uspGetAddress. Входным параметром является @City, и хранимая процедура выведет все столбцы таблицы Person.address, когда город равен городу, переданному через аргумент процедуры. Выполните этот код в своей базе данных AdventureWorks.

CREATE PROCEDURE dbo.uspGetAddress @City nvarchar(30)
AS
SELECT *
FROM Person.Address
WHERE City = @City
GO

В этом примере значением входного параметра будет New York.

EXEC dbo.uspGetAddress @City = 'New York'



Более подробно о хранимых процедурах можно узнать в статье.

Как использовать переменные в функциях SQL?


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

CREATE FUNCTION dbo.euros(@amount decimal(10,5), @rate decimal(10,5))
RETURNS decimal(10,5)
AS
BEGIN
RETURN @amount*@rate
END

Следующий пример показывает вызов этой функции.

SELECT dbo.euros(500,1.13) as euros



Как использовать переменные с SQLCMD?


SQLCMD - это командная строка SQL Server. Если вам нравится автоматизировать задачи с помощью bat-файлов, SQLCMD - это то, что вам нужно. Если вы не знакомы с SQLCMD, но хотите познакомиться, обратитесь к следующей статье.

В командной строке Windows выполните эту команду для подключения к SQL, используя аккаунт Windows.

sqlcmd -E

В sqlcmd перейдем к базе данных AdventureWorks, как показано ниже.

1> use adventureworks2019
2> go


Следующий пример установит переменную с именем tablename и значением humanresources.department, а затем сделает выборку из этой переменной.

1> :setvar tablename humanresources.department
1> select * from $(tablename)
2> go


Если все правильно, вы увидите данные в этой таблице.



Как использовать переменные в скрипте?


Вы можете также передать переменные в скрипт. Следующий пример создаст переменную с именем columnname1. Мы присвоим ей значение DepartmentID.

В примере мы создадим скрипт с именем myquery.sqlЮ который сохраним в папке sqlcmd.

USE AdventureWorks2019
GO
SELECT
$(columnname1)
from
[HumanResources].[Department]


Выйдите из sqlcmd, если вы еще находитесь там, и в командной строке Windows выполните команду:

sqlcmd -v columnname1 =DepartmentID -i c:\sqlcmd\myquery.sql

В командной строке будет выполнен оператор "select departmentid from humanresources.department".



Как использовать переменные в SSIS?


Переменные SSIS совершенно отличаются от переменных T-SQL. SSIS - это графическая среда, используемая для интеграции данных и которая имеет свои собственные переменные. Чтобы увидеть переменные в проекте SSIS, пройдите в Extensions > SSIS >Variables или для более ранних версий VS - SSIS > Variables.



Вы можете добавлять, удалять переменные на панели variables.



Существуют различные типы переменных в SSIS, например, Int32, int64, Object и Sbyte.



Использование переменных SSIS выходит за рамки этой статьи, однако имеются друге статьи по этой теме:
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

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

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.