Почему настолько трудно сделать цикл в T-SQL

Один из способов сделать это - вернуть статус «успешно» в ваш JSON. Затем вы можете проверить это на стороне клиента и предупредить сообщение при необходимости. Таким образом, вы можете изменить свой код следующим образом:

PHP

if ($numrows > 0 ) {
    $info_arr['data'] = array();
    while ($rows = mysqli_fetch_assoc($result)) {
        $fullname = $rows['fullname'];
        $address = $rows['address'];

        $info_arr['data'][] = array("fullname" => $fullname, "address" => $address);
    }
    $info_arr['success'] = true;
}
else {
    $info_arr = array('success' => false);
}
echo json_encode($info_arr);
exit;

jQuery:

success: function(data) {

  if (data.success) {
      var fullname = data.data[0]['fullname'];
      var address = data.data[0]['address'];
      document.getElementById('fullname').value = fullname;
      document.getElementById('address').value = address;
  }
  else {
      document.getElementById('fullname').value = '';
      document.getElementById('address').value = '';
      alert('Unable to find the information');
  }
}
6
задан Maksym Gontar 6 March 2009 в 21:06
поделиться

9 ответов

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

22
ответ дан 8 December 2019 в 02:30
поделиться

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

1
ответ дан 8 December 2019 в 02:30
поделиться

Я могу думать о тонне причин, которые я хотел бы проанализировать через набор результата запроса и сделать что-то, что просто не может быть сделано без цикла

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

10
ответ дан 8 December 2019 в 02:30
поделиться

T-SQL не разработан, чтобы быть императивным языком. Его разработанный для описания. Его декларативный характер позволяет optomizer нарезать различные задачи и выполнять их в параллели, и другими способами делают вещи в порядке, который является самым эффективным.

2
ответ дан 8 December 2019 в 02:30
поделиться

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

declare @i int
set @i = 20
while @i>0 begin
... do some stuff
set @i = @i-1
end

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

1
ответ дан 8 December 2019 в 02:30
поделиться

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

Статья Википедии об атомарности

-2
ответ дан 8 December 2019 в 02:30
поделиться

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

1
ответ дан 8 December 2019 в 02:30
поделиться

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

почему 20 строк? Это - все, в чем Вы нуждаетесь

select *,identity(int, 1,1) as Someid into #temp
from sysobjects

declare @id int, @MaxId int
select @id = 1,@MaxId = max(Someid) from #temp

while @id < @MaxId
begin
-- do your stuff here
print @id
set @id =@id + 1
end
1
ответ дан 8 December 2019 в 02:30
поделиться

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

В ТО ВРЕМЯ КАК наиболее распространенная структура цикличного выполнения, КУРСОРЫ могут также использоваться, но иметь свои собственные проблемы (упущение освободить / близко)

... пример того, В ТО ВРЕМЯ КАК (Вам, возможно, не понадобится он, но другие, может),

DECLARE @iterator INT
SET @iterator = 0

WHILE @iterator < 20
BEGIN
  SELECT * FROM table WHERE rowKey = @iterator
/*do stuff*/
  @iterator = @iterator + 1
END

Реальный вопрос, "Что Вы пытаетесь сделать, это просто не может быть сделано основанным на наборе способом?"

0
ответ дан 8 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: