Переменные языка Transact-SQL. Динамический запрос или "переменная @Tablename" Sql присвоение значения переменной в where

Инструкция SET присваивает значение переменной времени выполнения. Эти переменные могут быть системными переменными, специфичными для платформы, или пользовательскими переменными.

Ключевые слова

переменная

Обозначает системную или пользовательскую переменную.

значение

Обозначает строковое или числовое значение, соответствующее системной или пользовательской переменной.

Общие правила

Значения переменных устанавливаются на время сеанса. Значения, присвоенные переменной, должны соответствовать типу данных этой переменной. Например, вы не можете присвоить строковое значение переменной, которая объявлена с числовым типом данных. Команда, с помощью которой переменная создается, на разных платформах разная. Например, в DB2, Oracle и SQL Server используется инструкция DECLARE, в которой объявляется имя и тип переменной, однако на других платформах могут использоваться другие способы создания переменных.

Значение, которое присваивается переменной, не обязательно должно быть константой. Это может быть динамически генерируемое значение, создаваемое на основе подзапроса. Например, мы можем присвоить переменной emp_id_var максимальное значение идентификатора сотрудника (emp_id)|.

DECLARE emp_icLvar CHAR(5) SET empty var=(SELECT MAX(emp_id) FROM employees WHERE type="F")

В этом примере type F обозначает, что сотрудник работает полный день (full-time) и состоит на окладе.

Инструкция SET очень легко переносится с платформы на платформу. Только в Oracle используется несколько другая схема присвоения значения переменной. В следующем примере мы объявим в SQL Server переменную с именем emp_id_var и присвоим ей значение.

DECLARE emp_id var CHAR(5) SET emp_id_var="67888";

А теперь мы выполним ту же самую операцию для сервера Oracle.

DECLARE emp_id_var CHAR(5); emp_id_var:= "67888";

DB2

Платформа DB2 поддерживает базовую форму инструкции SET для присвоения значений локальным переменным, выходным параметрам или особым регистрам. В одной инструкции SET можно присваивать сразу несколько значений. Также эта инструкция позволяет присваивать значения столбцам базовой таблицы в триггере. Нельзя присвоить значения в одной инструкции двум типам переменных.

SET переменная={значение | NULL | DEFAULT} [, …]

Синтаксические элементы в DB2 следующие.

переменная

Указывается целевая переменная. Переменные SQL должны быть объявлены до использования. Переменная также может обозначать столбец базовой таблицы триггера.

значение

Указывается значение переменной в соответствии с ее типом данных. При присвоении значений столбцам в триггере вы также можете использовать ссылки на корреляционные имена OLD и NEW. За дополнительной информацией об этом обращайтесь к подразделу, посвященному DB2, раздела «Инструкция CREATE/ ALTER TRIGGER)).

Столбцу и переменной, которые могут принимать значения NULL, присваивается значение NULL.

Столбцам, которые создавались с указанием предложения WITH DEFAULT или IDENTITY, присваивается значение по умолчанию. Это предложение также присваивает пустое значение (NULL) тем столбцам, которые принимают пустые значения и при этом не определены с предложениями DEFAULTтя IDENTITY. Присвоим значение одной переменной.

SET new var.order_qty=125;

Если вы присваиваете значения в одной инструкции сразу нескольким переменным, то количество переменных слева от знака равенства должно в точности соответствовать количеству значений справа. Присвоим значения нескольким переменным.

SET new_var. order_qty=125, new_.va г. discount =

При использовании такого варианта, как SET переменная=SELECT значения результирующего набора инструкции SELECT должны в точности соответствовать переменным по количеству, положению и типу данных. Если инструкция SELECT не возвращает никаких значений, то переменным присваиваются значения NULL. Также для присвоения значений нескольким переменным в одной инструкции вы можете использовать инструкцию SELECT…INTO.

MySQL

Ключевое слово SET имеет в MySQL несколько способов использования. Во-первых, SET - это тип данных MySQL, в котором может быть несколько значений, разделенных запятыми. (За информацией об этой области применения обращайтесь к главе 2, раздел «Типы данных MySQL».) Кроме того, инструкция SET может присваивать значения пользовательской переменной. Здесь описывается именно этот способ применения. Синтаксис следующий:

SET переменная - значение […]

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

SET new_var.order_.aty - 125. new_var. discount - 4;

Кроме того, MySQL позволяет использовать инструкцию SELECT для присвоения значений переменным точно так же, как это описывается в разделе, посвященном стандарту ANSI. Однако у метода с использованием инструкции SELECT есть несколько слабых мест. Главная проблема состоит в том, что значения не присваиваются и инструкции SELECT немедленно. Таким образом, в следующем примере:

SELECT (_>new_var - row_id) AS а, (@new_var + 3) AS b FROM Lable_name;

переменная @new_var не получит нового значения row id + 3. Сохранится то значение, которое она имела в начале инструкции. Поэтому хорошей практикой является присвоение переменной только одного значения за раз.

Oracle

Предложение SET как метод присваивания значения переменным в Oracle не поддерживается. Вместо этого пользовательским переменным значения присваиваются при помощи оператора присваивания:=. Базовый синтаксис следующий.

PostgreSQL

В PostgreSQL команда SET используется для присваивания значения переменной во время выполнения.

SET переменная{ТО | -} {значение | DEFAULT}

Переменной во время выполнения можно присвоить строковое постоянное значение. При использовании ключевого слова DEFAULT переменной времени выполнения присваивается значение по умолчанию. Платформа PostgreSQL 7.2 поддерживает следующие переменные.

CLIENT ENCODING NAMES

Устанавливается мультибайтовая кодировка для клиентских систем PostgreSQL, скомпонованных с мультибайтовой поддержкой.

DATESTYLE

Устанавливается стиль, используемый для отображения даты и времени. Поддерживаются следующие стили.

Дата и время отображаются в формате ГПТ-ММ-ДД ЧЧ:ММ:СС (заданный по умолчанию стиль ISO 8601).

Дата и время отображаются в стиле Oracle/Ingres, а не в том стиле, который предписывается стандартом ANSI SQL.

PostgreSQL

Дата и время отображаются в длинном формате PostgreSQL, но не длиннее, чем задано по умолчанию.

Дата и время отображаются в виде ДД.ММ.ГГГГ. Вы можете уточнять стили SQL и Postgresql, используя ключевые слова European, US и NonEuropean, которые придают датам форматы дд/мм/гггг, мм/дд/гггг и мм/дд/гггг соответственно. Например: SETDATESTYLE=SQL, European.

Устанавливается начальное значение для внутреннего генератора случайных чисел. Значение может представлять собой любое число с плавающей точкой в диапазоне от 0 до 1, умноженное на 231-1. Это значение также можно установить при помощи функции PostgreSQL setseed. Например:

SELECT setseed(value); SEVER ENCODING;

Устанавливается мультибайтовая кодировка для серверов, скомпонованных с мульти-байтовой поддержкой.

Ниже приводится пример установки формата даты и времени стиля Oracle и European.

SET DATESTYLE ТО sql, European;

SOL Server

Платформа SQL Server поддерживает присваивание значений переменным при помощи инструкции SET, если эти переменные были ранее созданы при помощи инструкции DECLARE, а также присваивание значений переменным курсоров. (Также SQL Server использует инструкцию SET для других целей, например для включения и отключения флагов сеанса командами типа SETNOCOUNT ON.) Синтаксис, специфичный для данной платформы, приводится ниже.

Данная инструкция не поддерживает ключевое слово DEFAULT, но во всех прочих отношениях поддерживает синтаксис ANSI. Значение имя_сервера должно ссылаться на соединение, указанное в предыдущей инструкции CONNECT, либо в форме константы, либо в форме переменной.

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

    в качестве счетчика цикла;

    для хранения значения, которое необходимо проверить инструкцией управления потоком;

    для хранения значения, возвращенного функцией или хранимой процедурой.

Следующий скрипт создает небольшую тестовую таблицу из 26 строк. Переменная используется в скрипте в качестве:

    счетчика цикла для управления количеством вставляемых строк;

    значения, вставляемого в столбец целочисленного типа;

    аргумента функции, формирующей строку, которая вставляется в столбец символьного типа:

Create the table. CREATE TABLE TestTable (cola int, colb char(3)); GO SET NOCOUNT ON; GO -- Declare the variable to be used. DECLARE @MyCounter int; -- Initialize the variable. SET @MyCounter = 0; -- Test the variable to see if the loop is finished. WHILE (@MyCounter < 26) BEGIN; -- Insert a row into the table. INSERT INTO TestTable VALUES -- Use the variable to provide the integer value -- for cola. Also use it to generate a unique letter -- for each row. Use the ASCII function to get the -- integer value of "a". Add @MyCounter. Use CHAR to -- convert the sum back to the character @MyCounter -- characters after "a". (@MyCounter, CHAR((@MyCounter + ASCII("a")))); -- Increment the variable to count this iteration -- of the loop. SET @MyCounter = @MyCounter + 1; END; GO SET NOCOUNT OFF; GO -- View the data. SELECT cola, colb FROM TestTable; GO DROP TABLE TestTable; GO

Объявление переменных в языке Transact-SQL

Инструкция DECLARE инициализирует переменную Transact-SQL следующим образом:

    Назначение имени. Первым символом имени должен быть одиночный символ @.

    Назначение длины и типа данных, определяемого системой или пользователем. Для числовых переменных задаются также точность и масштаб. Для переменных типа XML может быть дополнительно задана коллекция схем.

    Присваивает созданной переменной значение NULL.

Например, следующая инструкция DECLARE создает локальную переменную @mycounter типа данных int .

DECLARE @MyCounter int;

Инструкция DECLARE позволяет объявить несколько локальных переменных одинакового или разного типов через запятую.

Например, следующая инструкция DECLARE создает три локальные переменные, @LastName , @FirstName и @StateProvince , и присваивает каждой из них значение NULL:

DECLARE @LastName nvarchar(30), @FirstName nvarchar(20), @StateProvince nchar(2);

Областью переменной называют диапазон инструкций Transact-SQL, которые могут к ней обращаться. Областью переменной являются все инструкции между ее объявлением и концом пакета или хранимой процедуры, где она объявлена. Например, следующий скрипт содержит синтаксическую ошибку, поскольку переменная объявлена в одном пакете, а используется в другом:

USE AdventureWorks2008R2; GO DECLARE @MyVariable int; SET @MyVariable = 1; -- Terminate the batch by using the GO keyword. GO -- @MyVariable has gone out of scope and no longer exists. -- This SELECT statement generates a syntax error because it is -- no longer legal to reference @MyVariable. SELECT BusinessEntityID, NationalIDNumber, JobTitle FROM HumanResources.Employee WHERE BusinessEntityID = @MyVariable;

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

DECLARE @MyVariable int; SET @MyVariable = 1; EXECUTE sp_executesql N"SELECT @MyVariable"; -- this produces an error

Присвоение значения переменной в языке Transact-SQL

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

Чтобы присвоить значение переменной при помощи инструкции SET, необходимо указать ее имя и присваиваемое значение. Этот способ присвоения значений переменным является предпочтительным. Например, следующий пакет объявляет две переменные, присваивает им значения и использует их в предложении WHERE инструкции SELECT :

USE AdventureWorks2008R2; GO -- Declare two variables. DECLARE @FirstNameVariable nvarchar(50), @PostalCodeVariable nvarchar(15); -- Set their values. SET @FirstNameVariable = N"Amy"; SET @PostalCodeVariable = N"BA5 3HX"; -- Use them in the WHERE clause of a SELECT statement. SELECT LastName, FirstName, JobTitle, City, StateProvinceName, CountryRegionName FROM HumanResources.vEmployee WHERE FirstName = @FirstNameVariable OR PostalCode = @PostalCodeVariable; GO

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

USE AdventureWorks2008R2; GO DECLARE @EmpIDVariable int; SELECT @EmpIDVariable = MAX(EmployeeID) FROM HumanResources.Employee; GO

Если инструкция SELECT возвращает более одной строки, и переменная ссылается на нескалярное выражение, ей присваивается значение, которое возвращается для выражения в последней строке результирующего набора. Например, в следующем пакете переменной @EmpIDVariable присваивается значение идентификатора BusinessEntityID последней возвращенной строки, равное 1:

USE AdventureWorks2008R2; GO DECLARE @EmpIDVariable int; SELECT @EmpIDVariable = BusinessEntityID FROM HumanResources.Employee ORDER BY BusinessEntityID DESC; SELECT @EmpIDVariable; GO

Прежде чем использовать переменную или константу в программе, ее почти всегда необходимо объявить. Все объявления должны размещаться в разделе объявлений программы PL/SQL . В PL/SQL объявления могут относиться к переменным, константам, TYPE (например, коллекциям или записям) и исключениям. В этой статье рассматриваются объявления переменных и констант .

Объявление переменной PL/SQL

Когда вы объявляете переменную, PL/SQL выделяет память для хранения ее значения и присваивает выделенной области памяти имя, по которому это значение можно извлекать и изменять. В объявлении также задается тип данных переменной; он используется для проверки присваиваемых ей значений. Базовый синтаксис объявления переменной или константы:

Имя тип_данных [ := | DEFAULT значение_по_умолчанию]; BEGIN FOR book_rec IN (SELECT * FROM book) LOOP process_book (book_rec); END LOOP; END;

Преимущества объявлений с привязкой

Во всех объявлениях тип переменной (символьный, числовой, логический и т. д.) задается явно. В каждом объявлении непосредственно указывается тип данных и, как правило, ограничение, налагаемое назначение этого типа. Это распространенный подход к объявлению переменных, но в некоторых ситуациях он может вызвать проблемы.

  • Синхронизация со столбцами базы данных. Переменная PL/SQL часто «представляет» информацию из таблицы базы данных. Если явно объявить переменную, а затем изменить структуру таблицы, это может привести к нарушению работы программы.
  • Нормализация локальных переменных. Допустим, переменная PL/SQL хранит вычисляемые значения, которые используются в разных местах приложения. К каким последствиям может привести повторение (жесткое кодирование) одних и тех же типов данных и ограничений во всех объявлениях?

Цель работы – знакомство с основными приципами программирования в MS SQL Server средствами встроенного языка Transact SQL.

1. Знакомство с правилами обозначения синтаксиса команд в справочной системе MS SQL Server (утилита Books Online).

2. Изучение правил написания программ на Transact SQL.

3. Изучение правил построения идентификаторов, правил объявления переменных и их типов.

4. Изучение работы с циклами и ветвлениями.

5. Изучение работы с переменными типа Table и Cursor.

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

7. Выполнение индивидуальных заданий по вариантам.

Пояснения к выполнению работы

Для освоения программирования используем пример базы данных c названием DB_Books, которая была создана в лабораторной работе №1.

При выполнении примеров и заданий обращайте внимание на соответствие названий БД, таблиц и других объектов проекта.

1. Специальные знаки и простейшие операторы в Transact SQL Знак Назначение Знак Назначение
* Знак умножения » » В них заключают строковые значения, если SET QUOTED_IDENTIFIER OFF
- Знак вычитания ‘ ’ В них заключают строковые значения*
% Остаток от деления двух чисел Не равно
+ Знак сложения или конкатенации (объединение двух строк в одну) Аналог кавычек, в них можнозаключать названия идентификаторов, если в их названиях встречаются пробелы
= Знак равенства или сравнения !< Не менее чем
Меньше или равно !> Не более чем
>= Больше или равно > Больше
!= Не равно < Меньше
@ Ставится перед именем переменной . Разделяет родительские и подчиненные объекты
@@ Указывает на системные функции / Знак деления
Однострочный комментарий или комментарий с текущей позиции и до конца строки /* */ Многострочный комментарий
2. Идентификаторы

Идентификаторы – это имена объектов, на которые можно ссылаться в программе, написанной на языке Transact SQL. Первый символ может состоять из букв английского алфавита или «_», »@», »#». В качестве остальных символов идентификатора могут быть дополнительно использованы цифры и символ «$». Имя идентификатора не должно совпадать с зарезервированным словом (среда SQL Server Management Studio подсвечивает зарезервированные слова синим цветом).

Иногда в качестве идентификатора удобно использовать словосочетание. Можно воспользоваться заменой пробела на нижнее подчеркивание, а можно использовать ограничители идентификаторов - квадратные скобки или одинарные кавычки. Здесь надо обратить внимание на параметр QUOTED_IDENTIFIER.

Для ограничителей идентификаторов при установленном параметре

SET QUOTED_IDENTIFIER ON

можно использовать как квадратные скобки, так и одинарные кавычки, а строковые значения могут быть заключены только в одинарные кавычки (режим по умолчанию).

Если использовать установленный параметр в режиме

SET QUOTED_IDENTIFIER OFF

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

Переменные используются для сохранения промежуточных данных в хранимых процедурах и функциях. Все переменные считаются локальными. Имя переменной должно начинаться с @.

3. Объявление переменных

Синтаксис

DECLARE @имя_переменной1 тип_переменной, …, @имя_переменнойN тип_переменной

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

DECLARE @имя_переменной1 тип_переменной(размер) , …, @имя_переменнойN тип_переменной(размер)

Пример:

DECLARE @a INT , @b NUMERIC (10 , 2 ) DECLARE @str CHAR (20 ) 4. Присвоение значений переменным и вывод значений на экран

Присвоение с помощью SET – обычное присвоение, синтаксис:

SET @имя_переменной = значение

Пример:

DECLARE @a INT , @b NUMERIC (10 , 2 ) SET @a = 20 SET @b = (@a+ @a) / 15 SELECT @b -- вывод на экран результата

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

Пример:

DECLARE @a INT SELECT @a = COUNT (* ) FROM Authors

Пример:

DECLARE @str CHAR (30 ) SELECT @str = name_author FROM Authors

В данном примере в переменную поместится последнее значение из результата запроса.

Пример:

DECLARE @a INT SET @a = (SELECT COUNT (* ) FROM Authors) 5. Работа с датой и временем

Оператор SET DATEFORMAT dmy | ymd | mdy задает порядок следования компонентов даты.

Пример:

SET DATEFORMAT dmy -- задает порядок следования компонентов даты. DECLARE @d DateTime -- объявляем переменную типа DateTime SET @d = "30.10.1821 0:00:00" SET @d = @d+ 1 -- прибавляем один день SELECT @d -- выводим значение переменной d в таблице 6. Создание временной таблицы через переменную типа TABLE

Объявляется через DECLARE с указанием в скобках столбцов таблицы, их типов, размеров, значений по умолчанию, а также индексов типа PRIMARY KEY или UNIQUE.

Пример:

/*Объявляем таблицу*/ DECLARE @mytable TABLE ( -- Объявление переменной типа TABLE id INT , -- Тип целых значений myname CHAR (20 ) DEFAULT "Введите имя" -- Тип значений и в ячейке выводится сообщение ) INSERT INTO @mytable(id) VALUES (1 ) -- Добавляем строку SELECT * FROM @mytable -- Выводим значение

Пример:

/*Объявляем таблицу*/ DECLARE @mytable TABLE ( id INT , myname CHAR (20 ) DEFAULT "Введите имя" ) INSERT @mytable SELECT Code_publish, City FROM Publishing_house SELECT * FROM @mytable 7. Преобразование типов переменных

Функция CAST возвращает значение, преобразованное к указанному типу:

CAST (@переменная или значение AS требуемый_тип_данных)

Пример:

DECLARE @d DateTime, @str CHAR (20 ) -- объявляем переменные типа DateTime и char SET @d = "31.01.2005 13:23:15" -- устанавливаем значение переменной d SET @str = CAST (@d AS CHAR (20 ) ) -- устанавливаем значение str, приводим к формату char SELECT @str -- выводит значение переменной

Функция CONVERT возвращает значение, преобразованное к указанному типу по заданному формату. Изучить дополнительно, по желанию.

8. Операторские скобки

BEGIN /* В них нельзя помещать команды, изменяющие структуры объектов БД. Операторские скобки должны содержать хотя бы один оператор. Требуются для конструкций поливариантных ветвлений, условных и циклических конструкций */ END

9. Условная конструкция IF

Синтаксис:

IF условие Набор операторов1 ELSE Набор операторов2

Пример:

DECLARE @a INT DECLARE @str CHAR (40 ) -- объявляет переменную типа CHAR SET @a = (SELECT COUNT (name_author) FROM Authors) -- устанавливает значение a, равное количеству -- записей в столбце name_author IF @a > 10 BEGIN SET @str = "Количество авторов больше 10" -- если а>10, то выводится сообщение "Количество авторов больше 10" SELECT @str END ELSE BEGIN SET @str = " Количество авторов = " + str(@a) -- иначе количество авторов равно значению переменной а SELECT @str -- вывод значения переменной str END 10. Цикл WHILE

Синтаксис:

WHILE Условие Набор операторов1 BREAK Набор опреторов2 CONTINUE

Конструкции BREAK и CONTINUE являются необязательными. Цикл можно принудительно остановить, если в его теле выполнить команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения всех команд в теле, необходимо выполнить команду CONTINUE.

Пример:

DECLARE @a INT -- объявляет переменную типа INT SET @a = 1 -- устанавливает значение а =1 WHILE @a < 100 -- цикл работает пока значение переменной а 40 ) AND (@a< 50 ) -- если значение переменной а>40 и a