我有一个非常简单的问题,但是我看不到解决方案...
我的查询:
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
有谁知道为什么我的“复杂”查询无法使用变量?