我正在创建自动切换分区程序。
我正在创建如下所示的表:
CREATE TABLE #MaxPartitionRows
(MaxRows BIGINT NOT NULL,
PNumber INT NOT NULL,
PFName SYSNAME NOT NULL,
Value VARCHAR(30) NOT NULL)
我用它来决定是否合并分区。
这些列是:每个分区函数表中的最大行数、分区号、分区函数和边界值。
逻辑是仅当下一个分区也为空时才合并分区。
所以我尝试了这个查询:
SELECT @vcPartitionFunction = PFName,
@vcBoundaryValue = Value,
@NextPartitionRowNum = LEAD(MaxRows) OVER (ORDER BY PNumber)
FROM #MaxPartitionRows
WHERE PNumber = @iMinPartitionNumberToSwitchOut
我遇到的问题是@NextPartitionRowNum获取NULL作为值,即使表中的行具有更大的分区号。
我的猜测是引擎不需要扫描下一行所以它返回NULL。
这是正确的假设吗?
在这种情况下,解决方法很简单,我只是使用
SELECT @NextPartitionRowNum = MaxRows
FROM #MaxPartitionRows
WHERE PNumber = @iMinPartitionNumberToSwitchOut + 1
但如果我做不到呢?
LEAD()
在WHERE
子句将结果限制为一行后计算(我假设这(PNumber)
是唯一的)。这就是为什么你总是得到NULL
for@NextPartitionRowNum
。您可以使用您的选择,只有当您确定值中没有间隙时
PNumber
:或者,您可以使用它(间隙与否,不影响它):
如果您更喜欢窗口函数,这也可以。首先计算
LEAD()
整个表,然后限制WHERE
: