Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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中的while循环_Sql_Sql Server_Loops_While Loop - Fatal编程技术网

在需要计数器时避免SQL中的while循环

在需要计数器时避免SQL中的while循环,sql,sql-server,loops,while-loop,Sql,Sql Server,Loops,While Loop,我觉得这是一个常见的问题,但我在SO或其他网站上找到的答案似乎都没有解决带计数器的while循环问题 假设我正在尝试用SQL编写一个存储过程,该过程将通过在当月剩余时间的每一天插入一行来填充用户的时间表。如果@endMonth变量保存当月的最后一天,那么我知道我可以很容易地编写一个while循环,并按照以下方式执行操作: WHILE @date <= @endMonth BEGIN //Do some action with the date, like an insert

我觉得这是一个常见的问题,但我在SO或其他网站上找到的答案似乎都没有解决带计数器的while循环问题

假设我正在尝试用SQL编写一个存储过程,该过程将通过在当月剩余时间的每一天插入一行来填充用户的时间表。如果@endMonth变量保存当月的最后一天,那么我知道我可以很容易地编写一个while循环,并按照以下方式执行操作:

WHILE @date <= @endMonth
BEGIN
    //Do some action with the date, like an insert
    SET @date = DATEADD(d, 1, @date) //increment the date by one day
END
然而,通过查看答案和其他网站,我相信如果可能的话,最好避免使用while循环

所以我的问题是:有没有一种方法可以不用WHILE结构在SQL中实现带计数器的循环?我将使用什么技术来转换类似于我发布的循环?或者像这样,我必须咬紧牙关,只用一个while循环吗

另一方面,下面的一些问题很接近,但它们似乎都没有完全解决需要计数器作为循环条件的问题。大多数答案似乎都谴责使用WHILE循环,但我似乎找不到一个通用的替代方案。
这个很接近,但不幸的是,对我来说,它只适用于自动递增列。一般情况下,您可以通过在同一选择中赋值并递增变量来递增值,而无需使用游标,如下所示:

DECLARE @i INT = 0

DECLARE @table TABLE
    (
      ID INT ,
      testfield VARCHAR(5)
    )

INSERT  INTO @table
        ( testfield )
VALUES  ( 'abcd'),
        ( 'efgh' ),
        ( 'ijkl' ),
        ( 'mnop' )


UPDATE  @table
SET     @I = ID = @i + 1

SELECT  *
FROM    @table

我看到了许多填充数据的示例

首先在cte中创建从开始日期到结束日期的日期,然后可以将其插入表中

其中之一是cte:

DECLARE @StartDate DateTime = '2014-06-01'
DECLARE @EndDate DateTime = '2014-06-29'



;WITH populateDates (dates) AS (

    SELECT @StartDate as dates
    UNION ALL
    SELECT DATEADD(d, 1, dates)
    FROM populateDates
    WHERE DATEADD(d, 1, dates)<=@EndDate

)
SELECT *
INTO dbo.SomeTable
FROM populateDates

您应该尝试在internet上查找如何在sql表中填充日期,如果丢失的代码是为每天插入一条记录,那么您可以加入一个发现丢失日期的CTE。一个摆脱while循环的一般情况,值得注意的是我应该认为的例外。。。顺便说一句,这里有大量CTE示例生成一系列日期,通常用于计算工作日等。这是我一直存在的问题。我个人在SQL中无法绕过while循环时仍然使用while循环,即使有人告诉我不要这样做。没有人提供过它坏的具体原因。它坏是因为它需要更长的时间和使用更多的资源。SQL是一种基于集合的语言。这是一个有趣的技巧,但我不确定我是否理解如何使用它来替换while循环。虽然我希望为带计数器的循环找到一个更通用的解决方案,但这一方法似乎对日期计数器很有效。尽管我不得不承认,我在CTE明显的速度优势和while循环的可读性之间左右为难。无论如何,谢谢你。