2014-12-20 2 views
2

У меня возникли проблемы с этим запросом. Проблема в том, что только один процесс - это первый, не работает для меня.Double While Transac SQL Server 2008

Это мой код: Хотя @j, Я не работа, но я не вижу ошибку ...

Спасибо за ваше время.

CREATE PROCEDURE InsertVar 
AS 

DECLARE @i int 
DECLARE @j int 

SET NOCOUNT ON; 
SET @i = 1 
SET @j = 1 

    WHILE @j < 21 
     BEGIN 
      WHILE @i < 11 
       BEGIN 
        INSERT INTO Var(idline,idVar,CheckBox) 
        VALUES(@j,@i,0); 
        SET @i = @i + 1; 
       END; 
     SET @j = @j + 1; 
    END; 

SELECT * FROM Var; 
GO 
+0

Не делайте этого Вы Loop слишком много времени – Dhaval

ответ

5

Есть и другие способы сделать эту логику (например, один запрос). Но ваша проблема заключается в том, что вы не перезапускаете i внутри цикла. Попробуйте это:

CREATE PROCEDURE InsertVar 
AS 
BEGIN 
    DECLARE @i int; 
    DECLARE @j int; 

    SET NOCOUNT ON; 
    SET @j = 1; 

    WHILE @j < 21 
     BEGIN 
      SET @i = 1; 
      WHILE @i < 11 
       BEGIN 
        INSERT INTO Var(idline, idVar, CheckBox) 
         VALUES(@j, @i, 0); 
        SET @i = @i + 1; 
       END; 
     SET @j = @j + 1; 
    END; 

    SELECT * FROM Var; 
END; 
GO 
+3

@Mohit бессмысленной установки 'NOCOUNT OFF' в конце технологича. Выход из процедуры все равно будет сброшен. –

0

Использование Recursive CTE для создания строк. Нет необходимости использовать while loop или declaration of varaiables.

CREATE PROCEDURE Insertvar 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     ;WITH cte 
      AS (SELECT 1 AS idline 
       UNION ALL 
       SELECT idline + 1 FROM cte 
       WHERE idline < 20), 
      cte1 
      AS (SELECT idline,1 AS idVar,0 AS CheckBox 
       FROM cte 
       UNION ALL 
       SELECT idline,idVar + 1,CheckBox FROM cte1 
       WHERE idVar < 10) 
     INSERT INTO [Var] 
     SELECT * FROM cte1 
     ORDER BY idline,idVar 

     SELECT * FROM [Var] 
    END 
+0

Я не знал об этом трюке. очень полезно – yaqui