Задать вопрос
@kapitoly
учусь

Делаю Insert в цикле, прописано условие окончания цикла, но почему-то не кончается?

CREATE PROC sp

AS

DECLARE @countrows int
SET @countrows = (select count(*) from таблица)

BEGIN
      insert into таблица (строка) values ( rand() )
WHILE 
      @countrows < 20

      IF @countrows > 20
      BREAK
   ELSE
      CONTINUE
	  
END


Предполагается, что если в таблице количество строк менее 20, (определяется функцией count(*) ) то цикл делает инсерт, и так до тех пор, пока строк не будет 20.

Цикл работает, но останавалиется только принудительно, когда уже сотни строк нагенерил(

В чем ошибка в коде?..

или может есть еще способы вставлять строки автоматом? (в примере их всего 20, но в жизни мне нужны тысячи строк)
  • Вопрос задан
  • 4387 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Ну, почему не ограничивается 20 - это вообще на поверхности, проверка-то вне цикла, а должна быть в нем.
Но делать так не есть верно - count достаточно тяжелая операция, и если к тому же там будут тысячи строк...

Переменную объявить и ее приращивать
DECLARE @i INT = 0;
тут цикл
if @i > 20 -- тут проверка
set @i = @i + 1; -- тут увеличение
И никакого дерганья сервера лишний раз. Это первый момент.
Второй момент - если надо просто тестовыми данными заполнить таблицу, то существуют решения, которые не просто это делают, но и генерят что-то похожее на реальные данные, это удобней, имхо. Тот же ToolBelt можно посмотреть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
swanrnd
@swanrnd
Издатель HTML5 игр
CREATE PROC sp

AS

DECLARE @countrows int
SET @countrows = (select count(*) from таблица)

BEGIN
      insert into таблица (строка) values ( rand() )
WHILE 
      @countrows < 20
SET @countrows = (select count(*) from таблица)
      IF @countrows > 20
      BREAK
   ELSE
      CONTINUE
    
END

Как-то так
Ответ написан
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Начать с простого:
SET NOCOUNT OFF
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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