Estou criando um procedimento de troca automática de partições.
Estou criando uma tabela que se parece com isso:
CREATE TABLE #MaxPartitionRows
(MaxRows BIGINT NOT NULL,
PNumber INT NOT NULL,
PFName SYSNAME NOT NULL,
Value VARCHAR(30) NOT NULL)
Estou usando-o para decidir se devo mesclar partições ou não.
As colunas são: máximo de linhas em tabelas por função de partição, número de partição, função de partição e valor de limite.
A lógica é mesclar a partição somente se a próxima partição também estiver vazia.
Então eu tentei esta consulta:
SELECT @vcPartitionFunction = PFName,
@vcBoundaryValue = Value,
@NextPartitionRowNum = LEAD(MaxRows) OVER (ORDER BY PNumber)
FROM #MaxPartitionRows
WHERE PNumber = @iMinPartitionNumberToSwitchOut
O problema que enfrentei é que @NextPartitionRowNum obtém NULL como valor, mesmo que haja linhas na tabela com número de partição maior.
Meu palpite é que o mecanismo não precisa verificar a próxima linha, então ele retorna NULL .
Essa é a suposição correta?
Neste caso, a solução alternativa é simples, basta usar
SELECT @NextPartitionRowNum = MaxRows
FROM #MaxPartitionRows
WHERE PNumber = @iMinPartitionNumberToSwitchOut + 1
Mas e se eu não pudesse fazer isso?
LEAD()
é calculado depois que aWHERE
cláusula limitou o resultado a uma linha (suponho que(PNumber)
seja exclusivo).NULL
É por isso que você sempre consegue@NextPartitionRowNum
.Você pode usar seu select, apenas se tiver certeza de que não há lacunas nos
PNumber
valores:Como alternativa, você pode usar isso (lacunas ou não, não afeta):
Se você preferir funções de janela, isso também funcionaria. Primeiro calcule
LEAD()
sobre toda a tabela e, em seguida, restrinja comWHERE
: