Статья №252
Перебор строк SQL выборки — создание цикла в сценарии
Компонент "SQL запрос" возвращает только первую строчку из SQL выборки. Как сделать цикл и обработать каждую строчку?
Есть много способов решить данную задачу. Я предложу свои, на мой взгляд достаточно простые способы решения задачи.
Запрос в oktell "перебор списка всех внутренних номеров":
declare @var1 as int
SET @var1=@ish
use oktell_settings
SELECT top 1 @otvet=prefix
FROM [oktell_settings].[dbo].[A_NumberPlan]
WHERE [ID] NOT IN
(SELECT top (@var1) [id]
FROM [oktell_settings].[dbo].[A_NumberPlan] ORDER BY [ID]
) ORDER BY [id]
выполняет поставленную задачу (проверял на ms sql server 2008 полной и express версиях). На вход подается параметр @ish — нумерация строк начинается с 0, т.е. цикл начинайте с перебора 0-ой строчки. На выход отдается @var1 номер телефона.
Полезное примечание 1: если (@var1) убрать скобочки, то запрос не будет работать.
Полезное примечание 2: если @ish передавать сразу во вложенный запрос, не присваивая объявленной переменной @var1, то работать не будет.
Если у вас ms sql server 2000, то такой запрос не будет выполнен. В 2000-ой версии можно создать хранимую процедуру и передавать в нее запрос на выполнение, либо обновить 2000-ую версию до 2008 (http://r.telsystems.ru/wiki/unconfirmed/251/).
Второй способ подсказал Дмитрий Шалавин )
Делаем SQL-запрос типа:
use oktell
declare @text varchar(5000)
set @text=''
select @text=@text+'<r>'+Prefix+'</r>'
FROM A_NumberPlan
select @text
Пример результата выполнения:
<r>admin2</r><r>Timur</r> <r>Богдана /r> <r>Natalia</r> <r>admin</r>
Результат можно в Oktell отработать в цикле при помощи элемента сценария Парсер. Теги можно перебирать при помощи команды eq(i) ... смотрите справку.
Красивое решение от Михаила Домброва:
select isnull(Prefix, Prefix) from A_NumberPlan for xml path('r')
результат такой:
<r>246</r><r>002</r><r>130</r><r>012</r><r>153</r><r>100</r><r>*</r><r>152</r><r>020</r><r>196</r><r>777</r><r>101</r><r>105</r><r>001</r><r>010</r><r>160</r><r>151</r><r>000</r><r>102</r><r>200</r>
перебор строк, перебор выборки, sql, запрос