Sql t цикл: MS SQL Server и T-SQL

Неужели циклы в T-SQL так тупо сделаны

 
Kolan ©
 
(2006-11-14 22:18)
[0]

Здравствуйте,
 Сижу, учусь, делаю лабораторную. Вот пример из нё:

ALTER PROCEDURE Accordance
AS
 DECLARE X CURSOR FOR
   SELECT COUNT(Number) AS AllEmp, Department
   FROM Employee
   GROUP BY Department;
OPEN X
DECLARE @Qty int, @Dept tinyint;
 FETCH NEXT FROM X INTO @Qty, @Dept
 UPDATE Department
   SET EmployeeCount = @Qty
   WHERE Number = @Dept;

WHILE @@FETCH_STATUS = 0
BEGIN
 FETCH NEXT FROM X INTO @Qty, @Dept
 UPDATE Department
   SET EmployeeCount = @Qty
   WHERE Number = @Dept;

END  
CLOSE X
DEALLOCATE X

Моя рука к этому не притрагивалась — только набрал. Работает. Но неужели нельзя организовать цикл так чтобы два раза не писать одно и тоже? Если можно, то как?


 
Johnmen ©
 
(2006-11-14 22:27)
[1]

Для while цикла всегда, не зависимо от языка, нужны разгонные значения. Т.к. он с предусловием.
Поэтому так:

FETCH NEXT FROM X INTO @Qty, @Dept
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Department
  SET EmployeeCount = @Qty
  WHERE Number = @Dept;
FETCH NEXT FROM X INTO @Qty, @Dept
END  


 
Anatoly Podgoretsky ©
 
(2006-11-14 22:28)
[2]

> Kolan  (14.11.2006 22:18:00)  [0]

Ты форум перепутал, у нас тут по Дельфи.
Сходи лучше на sql.ru там есть специализированый форум по MS SQL
Только не надо говорить, мол я в Дельфи программирую, программируй в чем хочешь, но это дело сервервное.


 
Kolan ©
 
(2006-11-14 22:46)
[3]

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


 
Kolan ©
 
(2006-11-14 22:46)
[4]

> Только не надо говорить, мол я в Дельфи программирую, программируй
> в чем хочешь, но это дело сервервное.

Дык я же там никого не знаю 🙂


 
Kolan ©
 
(2006-11-14 22:47)
[5]

Вопросы по базам данных (вопросы по использованию и программированию БД )
Вороде не нарушил правил .

ЗЫ
 А программирую я на Delphi! 🙂


 
Anatoly Podgoretsky ©
 
(2006-11-14 22:51)
[6]

> Kolan  (14.11.2006 22:46:04)  [4]

Не волнуйся, там люди культурные, не в пример нам.


 
Anatoly Podgoretsky ©
 
(2006-11-14 22:53)
[7]

> Kolan  (14.11.2006 22:47:05)  [5]

Вроде нарушил, это конференция по Дельфи и программирование в ней связаное с базами.
Твой вопрос ничего общего с Дельфи не имеет.
Обычно такие вопросы мы не закрываем, а говорим куда лучше сходить.
И ответ квалифицированый легче получить в специализированой конференции.


 
Kolan ©
 
(2006-11-14 23:00)
[8]

> [7] Anatoly Podgoretsky ©   (14.11.06 22:53)

Ок. Учту 🙂


 
sniknik ©
 
(2006-11-14 23:06)
[9]

Johnmen ©   (14. 11.06 22:27) [1]
ктото тут трюк с GOTO показывал, не будем про то хорошо это или плохо, делает из while аналог repeat until (в одном месте выборку писать, при больших удобноЮ не надо туда сюда копировать)

GOTO Start
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Department
 SET EmployeeCount = @Qty
 WHERE Number = @Dept;
Start:
FETCH NEXT FROM X INTO @Qty, @Dept
END


 
Johnmen ©
 
(2006-11-14 23:12)
[10]


> sniknik ©   (14.11.06 23:06) [9]

А-а-а… Там и метки ещё есть…:)))


 
Kolan ©
 
(2006-11-14 23:28)
[11]

> sniknik ©   (14.11.06 23:06)

Понятно. Благодарю. 🙂


НОУ ИНТУИТ | Лекция | Расширенное описание T-SQL

< Дополнительный материал 4 || Лекция 20: 12345678

Аннотация: Более углубленное изучение T-SQL продолжается в этой лекции. Рассматриваются новые конструкции: IF…ELSE, WHILE и CASE. Новые операторы, ранее не задействованные в примерах. Примеры и дополнительная информация, в сочетании со справочной системой SQL Server (Books Online) эффективно помогут вам разобраться во всех тонкостях нового материала.

Ключевые слова: операторы, identity, основной синтаксис, skinning, оператор DELETE, hint, junk, условия поиска, e-taxes, подзапрос, DESCRIBE, блок операторов, предупреждающее сообщение, aggregation, average, royalty, неявное преобразование типа, e-payment

Мы познакомились с этими операторами в предыдущих лекциях. Здесь также описываются ключевые слова T-SQL, используемые для управления последовательностью выполнения операторов. Вы можете использовать эти операторы и ключевые слова в любом месте, где применяется T-SQL, – в командных строках, сценариях, хранимых процедурах, в пакетных заданиях и прикладных проблемах. В частности, мы рассмотрим операторы обработки данных INSERT, UPDATE и DELETE (см.

«лекцию 13»
), а также программные конструкции IF…ELSE, WHILE и CASE.

Прежде чем перейти к нашей основной теме, мы создадим таблицу items для использования в наших примерах. (Мы создадим эту таблицу в базе данных MyDB.) Ниже приводятся операторы T-SQL, используемые для создания таблицы items:

USE MyDB
GO
CREATE TABLE items
(
item_category    CHAR(20)        NOT NULL,
item_id          SMALLINT        NOT NULL,
price            SMALLMONEY        NULL,
item_desc        VARCHAR(30)       DEFAULT 'No desc'
)
GO

Колонка item_id могла бы вполне подойти для свойства IDENTITY. (См. раздел «Добавление свойства IDENTITY» в
«лекции 10»
). Но поскольку вы не можете явным образом помещать значения в такую колонку, то мы не используем здесь свойство IDENTITY. В данном случае мы будем использовать более гибкий подход в примерах, где используется оператор INSERT.

Оператор INSERT

Оператор INSERT, введенный в
«лекции 13»
, используется для добавления новой строки или строк в таблицу или представление. Ниже показан основной синтаксис для оператора INSERT:

INSERT [INTO] имя_таблицы [(список_колонок)] VALUES
  выражение | производная_таблица

Ключевое слово INTO и параметр список_колонок не являются обязательными. Параметр список_колонок указывает, в какие колонки вы помещаете данные; эти значения имеют взаимно-однозначное соответствие (по порядку) со значениями, указанными в выражении (которое может быть просто списком значений). Рассмотрим некоторые примеры.

Вставка строк

В следующем примере показано, как вставить одну строку данных в таблицу items:

INSERT INTO items
    (item_category, item_id, price, item_desc) 
VALUES ('health food', 1, 4.00, 'tofu 6 oz. ') 
GO

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

INSERT INTO items
VALUES (1, 'health food', 4.00, 'tofu 6 oz.')
GO
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value 'health food' to a column
of data type smallint.
(Синтаксическая ошибка в результате преобразования varchar-значения 'health food' 
в колонке данных типа smallint)

Невыполнение вставки строки и это сообщение являются следствием неверного порядка значений Мы пытались поместить значение item_id в колонку item_category и значение item_category в колонку item_id. Указанные значения несовместимы с типами данных для этих колонок. Если бы они были совместимы, то SQL Server позволил бы вставить данную строку независимо от порядка следования значений.

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

SELECT * from items
GO
Вы получите следующий набор результатов:
item_category    item_id   price      item_desc
-------------------------------------------------------
health food      1         4.0000      tofu 6 oz.

При создании таблицы items было определено, что колонка price (цена) может содержать пустые значения, а для колонки item_desc (описание) было задано значение по умолчанию No desc. (Нет описания). Если в операторе INSERT не указано никакого значения для колонки price, то в эту колонку для новой строки будет помещено значение NULL. Если не указано никакого значения для колонки item_desc, то в эту колонку для новой строки будет помещено значение No desc.

Дальше >>

< Дополнительный материал 4 || Лекция 20: 12345678

Программирование T-SQL, часть 2. Создание цикла T-SQL

Поиск

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

Цикл программирования — это фрагмент кода
, который выполняется снова и снова. В цикле некоторая логика выполняется многократно итеративно, пока не будет выполнено некоторое условие, позволяющее коду выйти из цикла. Одним из примеров использования цикла
может быть обработка набора записей по одной записи за раз.
Другим примером может быть ситуация, когда вам нужно сгенерировать некоторые тестовые данные, а цикл
позволит вам вставить запись в таблицу тестовых данных с небольшим
различных значений столбца при каждом выполнении цикла. В этой статье I
будут обсуждаться операторы WHILE, BREAK, CONTINUE и GOTO.

Оператор WHILE

В T-SQL оператор WHILE
является наиболее часто используемым способом выполнения цикла. Вот основной синтаксис для
цикла WHILE:

WHILE <логическое выражение> <кодовый блок> 

Где <логическое выражение
> — это любое выражение, соответствующее истинному или ложному ответу, и
<блок кода> — это код желания, который должен быть выполнен, пока <логическое выражение
> истинно. Давайте рассмотрим реальный простой пример.

В этом примере я буду увеличивать
счетчика с 1 до 10 и отображать счетчик каждый раз в цикле WHILE
.

 
объявить @counter int
установить @counter = 0
в то время как @counter < 10
begin
установить @counter = @counter + 1
print ‘The counter is ‘ + cast(@counter as char)
end

Здесь код выполняет оператор
WHILE, пока целочисленная переменная @counter меньше 10, это
является логическим выражением цикла WHILE. Переменная @counter начинается с нуля
и каждый раз в цикле WHILE увеличивается на 1. Оператор
PRINT отображает значение переменной @counter каждый раз в цикле WHILE
. Результат этого примера выглядит следующим образом:

 
Счетчик равен 1
Счетчик равен 2
Счетчик 3
Счетчик 4
Счетчик 5
Счетчик 6
Счетчик 7
Счетчик 8
Счетчик 9
Счетчик 10

Как видите, после
Переменная @counter достигает значения 10, логическое выражение, управляющее циклом WHILE
, больше не истинно, поэтому код в цикле while больше не выполняется.

Вы можете иметь не только одиночный цикл while
, но и циклы WHILE внутри циклов WHILE. Или
обычно называют вложением циклов WHILE. Существует множество различных применений
, в которых ценна вложенность. Обычно я использую вложение циклов WHILE для генерации
тестовых данных. В следующем примере я буду использовать цикл WHILE для создания тестовых записей
для таблицы PART. Данная запись PART уникально идентифицируется Part_Id и
Category_Id. Для каждого Part_Id есть три разных Category_Id. Здесь
— мой пример, который генерирует 6 уникальных записей для моей таблицы PART, используя вложенные
Пока цикл.

 
объявлять @Part_Id int
объявлять @Category_Id int
объявлять @Desc varchar(50)
создавать таблицу PART (Part_Id int, Category_Id int, Description varchar(50))
set @Part_Id = 0
set @Category_I д = 0
в то время как @Part_Id < 2
begin
set @Part_Id = @Part_Id + 1
в то время как @Category_Id < 3
begin
set @Category_Id = @Category_Id + 1
set @Desc = 'Part_Id is ' + cast(@Part_Id as char( 1)) +
'Category_Id' + cast(@Category_Id as char(1))
вставить в значения PART(@Part_Id,
@Category_Id,
@Desc )
end
set @Category_Id = 0
end
select * from PART
drop table PART

Вот вывод из 9 0009 Оператор SELECT в в нижней части этого вложенного примера цикла WHILE.

 
Part_Id Category_Id Описание
———— ———— ——————————————
1 1 Part_Id равен 1 Category_Id 1
1 2 Part_Id равен 1 Category_Id 2
1 3 Part_Id равен 1 Идентификатор_Категории 3
2 1 Part_Id равен 2 Category_Id 1
2 2 Part_Id равен 2 Category_Id 2
2 3 Part_Id равен 2 Category_Id 3

Как видите, при использовании вложенного цикла WHILE
каждая комбинация Part_Id и Category_Id уникальна. Код
в первом цикле WHILE управляет увеличением Part_Id,
, где второй цикл WHILE устанавливает для Category_Id другое значение каждые
раз в цикле. Код в первом цикле while был выполнен только
дважды, но код во втором цикле WHILE был выполнен 6 раз. Таким образом,
дает мне 6 образцов записей PART.

SQL Server WHILE Циклы

Этот веб-сайт использует файлы cookie. Используя сайт, вы принимаете политику использования файлов cookie. Это сообщение соответствует законодательству Великобритании об ICO.

SQL 2005+

Ричарда Карра, опубликовано на http://www.blackwasp.co.uk/sqlwhile.aspx

В пятьдесят пятой части учебника по основам программирования SQL Server рассматриваются ) ПОКА заявление. Эта мощная команда управления потоком позволяет создавать циклические структуры в сценариях и хранимых процедурах.

Предыдущий: Условия IF SQL Server

Петли

Циклические структуры позволяют многократно выполнять одну команду или группу операторов. При использовании цикла T-SQL WHILE логическое условие проверяется каждый раз перед запуском кода внутри цикла. Если условие истинно, цикл выполняется. Если нет, управление переходит к оператору, следующему за циклом.

Циклы

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

Использование циклов WHILE

Синтаксис создания цикла while следующий:

ПОКА условие условия

Этот синтаксис аналогичен основному синтаксису оператора IF, который мы видели в предыдущей статье. Элемент условия задает значение, переменную или выражение, которое оценивается как истинное или ложное. Если значение равно true, выполняется оператор , часть команды . После завершения условие снова проверяется, и процесс продолжается до тех пор, пока условие не станет ложным. NB: Элемент оператора может содержать несколько команд, если они появляются между командами BEGIN и END.

Мы можем продемонстрировать цикл, выполнив сценарий в SQL Server Management Studio или в предпочитаемой вами среде для запуска T-SQL. Следующий сценарий объявляет переменную и инициализирует ее значение нулем. Условие цикла указывает, что содержащиеся операторы будут выполняться, пока значение переменной меньше или равно десяти. В цикле значение переменной увеличивается и печатается. Конечным результатом является то, что выводятся целые числа от одного до десяти.

 DECLARE @Iteration INT
УСТАНОВИТЕ @Итерация = 1
ПОКА @Итерация <= 10
НАЧИНАТЬ
    ПЕЧАТЬ @Итерация
    УСТАНОВИТЬ @Итерация = @Итерация + 1
КОНЕЦ 

Явный выход из цикла

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

В следующем примере скрипта цикл вычисляет квадраты значений от одного до девяноста девяти. Оператор IF проверяет, превышает ли результат возведения в квадрат тысячу. В первый раз, когда это происходит, цикл завершается, хотя переменная @ToSquare по-прежнему меньше сотни.

 DECLARE @ToSquare INT
ОБЪЯВИТЬ @Square INT
УСТАНОВИТЕ @ToSquare = 0
ПОКА @ToSquare < 100
НАЧИНАТЬ
    НАБОР @ToSquare = @ToSquare + 1
    SET @Square = @ToSquare * @ToSquare
    ЕСЛИ @Квадрат > 1000
        ПЕРЕРЫВ
    ПЕЧАТЬ @Square
КОНЕЦ 

Перезапуск цикла

Если вы хотите завершить одну итерацию цикла, вы можете использовать команду CONTINUE . Эта команда немедленно останавливает текущую итерацию и повторно проверяет состояние цикла. Если условие по-прежнему верно, цикл перезапускается. В следующем примере оператор CONTINUE и оператор BREAK комбинируются таким образом, что выводятся квадраты в диапазоне от ста до одной тысячи.

 DECLARE @ToSquare INT
ОБЪЯВИТЬ @Square INT
УСТАНОВИТЕ @ToSquare = 0
ПОКА @ToSquare < 100
НАЧИНАТЬ
    НАБОР @ToSquare = @ToSquare + 1
    SET @Square = @ToSquare * @ToSquare
    ЕСЛИ @Квадрат < 100
        ПРОДОЛЖАТЬ
    ЕСЛИ @Квадрат > 1000
        ПЕРЕРЫВ
    ПЕЧАТЬ @Square
КОНЕЦ 

Вложение

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

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