Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server循环并在SQL中插入_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL Server循环并在SQL中插入

SQL Server循环并在SQL中插入,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要在SQL中运行一个循环。谷歌由于一些奇怪的原因,这有点难。在SQLServer中,我刚刚把它放在SQLServerManagementStudio中的查询编辑器中 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

我需要在SQL中运行一个循环。谷歌由于一些奇怪的原因,这有点难。在SQLServer中,我刚刚把它放在SQLServerManagementStudio中的查询编辑器中

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,0到14,14,只跳过0,14,因为这已经在表中了

我想我很接近了。有人知道它在哪里吗?非常感谢。
干杯-Jeremy

在第一次循环后,您不会将@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

您可以使用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中基于集合的操作通常比过程性的逐行方法更干净、更容易理解

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)