2012-03-26 12 views
3

SQLでループを実行する必要があります。 Googleはちょっと奇妙な理由で少し難しいです。 SQL Serverで、私はちょうど私がやりたいすべてがzoom_startを設定し、(14,14)に(0,0)そうzoom_endすることですこれは、SQL Serverの経営管理論メーカーSQL Serverのループと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 

でクエリエディタである置くだけスキップ(0,14)が既にテーブルにあるように表示されます。

私は近いと思います。誰がそれがどこにあるのか知っていますか?ありがとうございました。 乾杯 - ジェレミー

答えて

14

代わりのネストされたループを行うと、あなたはCTE(または既存の番号テーブル)を使用すると、一度に必要なすべての行を追加することができ、一度にそれぞれの行を挿入を行います。

;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) 

SQLのセットベースの操作は、手続き型の行単位のアプローチよりも、通常はより洗練され、わかりやすいものです。

+0

Nice Solution !! – rlobban

+0

+1 ...タリー・テーブルは、常にSQLのループでnodを取得します。 –

+0

うわー..はい。ここで私を勉強するためにここに+1してください。 :D –

2

最初のループの後に@z_endをゼロに再初期化しません。

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)