2012-03-26 4 views
3

J'ai besoin d'exécuter une boucle dans SQL. Google c'est un peu difficile pour une raison étrange. Dans SQL Server je viens de mettre cela est dans l'éditeur de requête SQL dans Managment Server Management StudioSQL Server boucle et insérer en SQL

DECLARE @z_start INT 
SET @z_start = 0 
DECLARE @z_end INT 
SET @z_end = 0 

WHILE (@z_start <= 14) BEGIN 
    IF(@z_start != 0 AND @z_end != 14) 
     WHILE (@z_end <= 14) BEGIN 
      INSERT INTO [campusMap].[dbo].[zoom_levels] ([zoom_start],[zoom_end]) VALUES (@z_start,@z_end) 
      SET @z_end = @z_end + 1 
     END 
     SET @z_start = @z_start + 1 
    END 
END 

Tout ce que je veux faire est de régler la zoom_start et zoom_end donc (0,0) à (14,14) sauter seulement (0,14) car cela est déjà dans le tableau.

Je pense que je suis proche. Quelqu'un sait où il est éteint? Je vous remercie. Cheers -Jeremy

Répondre

14

Au lieu de faire une boucle imbriquée et insérée à chaque ligne à la fois, vous pouvez utiliser un CTE (ou une table de numéros pré-existants) et ajouter toutes les lignes dont vous avez besoin à la fois:

;WITH Numbers (Number) AS 
(
    SELECT 0 
    UNION ALL 
    SELECT 1 + Number FROM Numbers 
    WHERE 1 + Number <= 14 
) 
INSERT INTO [campusMap].[dbo].[zoom_levels] ([zoom_start],[zoom_end]) 
SELECT n1.Number, n2.Number 
FROM 
    Numbers n1 CROSS JOIN 
    Numbers n2 
WHERE 
    NOT (n1.Number = 0 AND n2.Number = 14) 

Les opérations basées sur des ensembles dans SQL sont généralement plus propres et plus faciles à comprendre que les approches procédurales, rangée par ligne.

+0

Belle Solution !! – rlobban

+0

+1 ... Tally table obtient toujours le signe de tête sur une boucle en sql. –

+0

wow .. oui .. +1 ici pour tk pour m'apprendre là-bas. :RÉ –

2

Vous ne réinitialisez pas @z_end à zéro après la première boucle. Ne

DECLARE @z_start INT 
SET @z_start = 0 
DECLARE @z_end INT 
SET @z_end = 0 
WHILE (@z_start <= 14) BEGIN 
    IF(@z_start != 0 AND @z_end != 14) 
     WHILE (@z_end <= 14) BEGIN 
      INSERT INTO [campusMap].[dbo].[zoom_levels] ([zoom_start],[zoom_end]) VALUES (@z_start,@z_end) 
      SET @z_end = @z_end + 1 
     END 
     SET @z_start = @z_start + 1 
     SET @z_end = 0 
    END 
END 
1
insert into [campusMap].[dbo].[zoom_levels] ([zoom_start],[zoom_end]) 
select T1.N, T2.N 
from 
    (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14)) as T1(N) 
cross join 
    (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14)) as T2(N) 
where not (T1.N = 0 and T2.N = 14)