2.20. Переменные

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

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

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

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

Вы объявляете локальные переменные в операторе DECLARE и после этого назначаете ему индивидуальное значение с помощью операторов SET или SELECT. Используйте оператор SET, когда желаемое значение известно, а оператор SELECT, когда вам нужно получить желаемое значение из таблицы. После того, как вы назначили переменное значение, вы можете использовать его в операторах, группах и процедурах, в которых они объявлены. Группы - это набор операторов Transact-SQL, которые отправляются вместе и исполняются как группа (несколько последовательно выполняемых команд). Мы не раз уже использовали группы, и вы их можете увидеть в листингах 2.9, 2.10 и так далее.

Имя локальной переменной начинается с одного символом @ в начале имени. Общий вид объявления переменной:

DECLARE {@local_variable datatype} [,..n]

Пример установки переменной значения:

SET @имя = значение

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

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

Листинг 2.13. Пример использования переменных

-- Объявляем две переменные @vLastName и @vFirstName,
-- которые имеют тип varchar размером в 50 символов
DECLARE @vLastName   varchar(50),
        @vFirstName  varchar(50)

-- Устанавливаем переменную фамилии @vLastName
SET @vLastName='%СИДОРОВ'

-- Выбираем имя работника из таблицы и записываем его в 
-- переменную @vFirstName
SELECT @vFirstName = vcName
FROM tbPeoples
WHERE vcFamil LIKE @vLastName

-- Печатаем результат
PRINT 'Имя Cидорова '+@vFirstName

В результате на экране мы должны увидеть сообщение:

Имя Cидорова ИВАН

Теперь посмотрим, что происходит в сценарии. Сначала мы объявляем две переменные. Это можно сделать двумя способами. Первый – после ключевого слова DECLARE перечислить через запятую имена переменных и их тип, как показано в листинге 2.13. Напоминаю, что имя переменной должно начинаться с @.

Второй способ – каждую переменную описать в отдельной секции DECLARE:

DECLARE @vLastName   varchar(50)
DECLARE @vFirstName  varchar(50)

Теперь переменной @vLastName, которая должна хранить фамилию работника, присваиваем значение '%СИДОРОВ'. Вначале фамилии стоит знак %, потому что в конце раздела 2.17 мы прибавили в начало каждой фамилии буквы mr. Если вы выполняли этот запрос, то обязательно необходимо добавить знак процента или переменной присвоить значение 'mr.СИДОРОВ'.

Теперь выполняем запрос SELECT. Давайте рассмотрим его построчно:

  1. SELECT @vFirstName = vcName – после оператора SELECT, указываем, что необходимо значение поля "vcName" присвоить переменной @vFirstName;
  2. FROM tbPeoples – данные выбираются из таблицы tbPeoples;
  3. WHERE vcFamil LIKE @vLastName – в условии поиска мы указываем, что поле "vcFamil" должно соответствовать содержимому шаблона в переменной @vLastName.

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

print('Команда недопустима')

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

DECLARE @Transname   varchar(50)

BEGIN TRANSACTION @Transname

INSERT INTO tbPeoples(vcFamil, vcName) 
VALUES('ВАСИЛЬКОВ', 'ИВАН')

COMMIT TRANSACTION @Transname

Глобальные переменные начинаются с двух символов @@. Когда вы создаете собственные программы на языке Transact-SQL, то рекомендую использовать только локальные переменные, чтобы случайно не спровоцировать конфликта имен или значений. Так как глобальные переменные доступны всем, то их может увидеть любой пользователь, подключенный в данный момент к серверу.

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

  1. @@SERVERNAME – содержит имя экземпляра MS SQL Server;
  2. @@VERSION – информация о версии SQL Server;
  3. @@ROWCOUNT – содержит количество строк, обработанных последней выполненной командой;
  4. @@SPID – идентификатор текущего процесса;
  5. @@TRANCOUNT – уровень вложенности транзакций;
  6. @@NESTLEVEL – уровень вложенности при выполнении хранимых процедур и триггеров;
  7. @@OPTIONS – текущие настройки серверных параметров;
  8. @@ERROR – содержит код ошибки последней выполненной команды;
  9. @@IDENTITY – последнее значение счетчика, которое было использовано после добавления строки.
  10. @@CURSOR_ROWS – возвращает количество записей, полученных последней командой открытия курсора.

В следующих главах мы еще будем возвращаться к глобальным переменным и некоторые из них рассмотрим более подробно. Рассматривать все переменные сейчас не имеет смысла, потому что у нас еще не достаточно информации о языке Transact-SQL и базе данных MS SQL Server. А сейчас ограничимся только общими понятиями и простым примером.

В качестве примера, давайте посмотрим, как определить имя установленного экземпляра MS SQL Server. Для этого необходимо выполнить следующую команду:

SELECT @@SERVERNAME

В моем случае я увидел в качестве результата строку с единственным безымянным полем, в котором находился текст: CYD\FLENOV.

Предыдущая глава

2.19. Транзакции

Следующая глава

2.21. Конвертирование типов

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

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

Пишите мне