SQL Server Query不会对变量执行,而是使用硬编码值执行

时间:2016-05-30 13:35:03

标签: sql-server variables while-loop iteration

我有一个非常简单的问题,但是我看不到解决方案...

我的查询:

DECLARE @DAY INT, @WAITFORVAL VARCHAR(8),
        @ITERATION INT, @ROWCOUNT INT, @TOTALROWS INT

SET DEADLOCK_PRIORITY LOW
SET @DAY = 0
SET @WAITFORVAL = '00:00:01'
SET @ITERATION = 0
SET @ROWCOUNT = 0
SET @TOTALROWS = 0

WHILE @DAY > -1 
BEGIN 
  WITH dupl AS
  (SELECT row_number() OVER(PARTITION BY col1, col2, col3
                        ORDER BY id) rn,
                                     id,
                                     col1,
                                     col2,
                                     col3
   FROM dbo.myTable
   WHERE col4 = 'heartbeat'
     AND col3 < DATEADD(DAY, @DAY, (DATEADD(HOUR, - 0 + DATEDIFF(HOUR, GETDATE(), GetUTCDate()), GetUTCDate())))
     AND col3 > DATEADD(DAY, @DAY, (DATEADD(HOUR, - 24 + DATEDIFF(HOUR, GETDATE(), GetUTCDate()), GetUTCDate())))
  )
  SELECT *
  FROM dupl
  WHERE rn > 1 PRINT 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Day: ' + CAST(@DAY AS VARCHAR) + ' Count: ' + CAST(@@ROWCOUNT AS VARCHAR) + ' Total :' + CAST(@TOTALROWS AS VARCHAR)

  SET @DAY = @DAY - 1
  SET @ITERATION = @ITERATION + 1 

  WAITFOR DELAY @WAITFORVAL 
END

因此,我的查询所做的(或应该做的)是每天在myTable中选择所有重复的心跳(如果它正在工作,我将用DELETE替换SELECT *)并打印结果。请忽略DATEADD(HOUR...部分,这是因为我们的系统中存在一个非常奇怪的错误并且难以解释;重要的部分是DATEADD(DAY...部分(DAY,而不是HOUR)。

查询将永远执行,并在5分钟后取消它(忘记它正在运行)。当我更改以下部分时(它在那里两次):

DATEADD(DAY, @DAY, (DATEADD(HOUR...

DATEADD(DAY, 0, (DATEADD(HOUR...

查询将在几秒钟内运行,打印第一次迭代的结果并停止(因为@DAY将降低1,使WHILE停止)。

因此,只要我将值从变量更改为硬编码INT,查询就无法执行(至少在正常时间内)。我根本无法理解为什么,因为我创建了一个类似的查询,但不那么复杂,它与变量完美地执行。所以我在想,它必须归结于复杂的WHERE子句或WITH部分,但它究竟是什么......

有人有建议吗?我尝试了转换@DAY变量,尝试在变量外移动减号,...

执行的简单查询,当然:

DECLARE @my_var INT
SET @my_var = 1

WHILE @my_var < 10
BEGIN
    SELECT TOP(@my_var) *
    FROM dbo.myTable

    SET @my_var = @my_var + 1
END

有谁知道为什么我的“复杂”查询无法使用变量?

0 个答案:

没有答案