transact sql

Переменные и курсор в Transact SQL

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

Сначала переменную нужно объявить:

DECLARE @MyVar int -- объявим переменную, тип число
SET @MyVar=10 -- присвоим значение переменной
SELECT @MyVar=count(*) FROM Products -- считаем значение переменной из таблицы

После этого можно обращаться к этой переменной откуда угодно.

Кроме переменных в языке sql есть обычные алгоритмические операторы и инструкции: цикл, ветвление, выбор.

Пример ветвления:

IF @MyVar>40
   SELECT 1
ELSE
   BEGIN
      SELECT 2
      SELECT 3
      SELECT 4
   END

Пример цикла:

WHILE @MyVar=19
   BEGIN
      SELECT @MyVar
      SET @MyVar=@MyVar-3
   END

Такие операции работают довольно медленно, поэтому не рекомендую их часто использовать.

Использование курсора

Поскольку в языке sql не понятия массива, то вместо него можно использовать курсор. Пример:

DECLARE MyCursor CURSOR --объявляем курсор
   FOR
      SELECT ProductName, UnitPrice
      FROM Products
      ORDER BY UnitPrice DESC
OPEN MyCursor --вызываем отработку курсора
--внутри работаем,как с массивом
FETCH NEXT FROM MyCursor
FETCH NEXT FROM MyCursor
FETCH NEXT FROM MyCursor
CLOSE MyCursor --закрываем курсор
DEALLOCATE MyCursor --уничтожаем курсор

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

Открываем курсор — закрываем курсор. А внутри этой конструкции можно работать с таблицей так, как-будто перед нами массив. Вызываем оператор FETCH — он позиционирует указатель на ту ячейку, которая нам нужна и выдает ее содержимое. К ячейке можно обращаться по номеру или словами NEXT и т.п.

Обычно, чтобы начать работать со всем массивом, его надо сначало перебрать весь. См. ниже:

OPEN MyCursor
FETCH NEXT FROM MyCursor --установим начальное положение курсора
WHILE @@FETCH_STATUS=0 -- перебор
  BEGIN
   --любые команды
   FETCH NEXT FROM MyCursor
  END
CLOSE MyCursor



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

Ваш e-mail не будет опубликован.