Gostaria de criar um procedimento armazenado que criará uma linha em uma tabela para todos os dias em um determinado intervalo de datas. O Stored Procedure aceita duas entradas - Uma data de início e uma data de término do intervalo de datas desejado pelo usuário.
Então, digamos que eu tenha uma tabela assim:
SELECT Day, Currency
FROM ConversionTable
Day é um DateTime e Currency é apenas um inteiro.
Para manter as coisas simples, vamos apenas dizer que eu sempre quero que a coluna Moeda seja 1 para cada uma dessas linhas inseridas. Portanto, se alguém inserir '5 de março de 2017' como data de início e '11 de abril de 2017' como data de término, gostaria que as seguintes linhas fossem criadas:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
Qual é a melhor maneira de codificar o procedimento armazenado para fazer isso? Estou usando o SQL Server 2008 R2 em meu ambiente de teste, mas nosso ambiente real usa o SQL Server 2012, então posso atualizar minha máquina de teste se houver uma nova funcionalidade introduzida em 2012 que facilite essa tarefa.
Uma opção é um CTE recursivo:
(
MAXRECURSION
dica adicionada graças ao comentário de Scott Hodgin, abaixo.)Outra opção é usar uma função com valor de tabela. Essa abordagem é muito rápida e oferece um pouco mais de flexibilidade. Você fornece o intervalo de data/hora, parte de data e incremento. Também oferece a vantagem de incluí-lo em um CROSS APPLY
Por exemplo
Devoluções
A UDF se estiver interessado
Usando o post de Aaron Bertrand sobre como criar uma tabela de dimensão de data como exemplo, cheguei a isso:
Você deve poder colocar esse tipo de lógica em seu procedimento armazenado e adicionar o que mais precisar.
Eu tive que resolver um problema semelhante recentemente no Redshift, onde eu só tinha acesso de leitura e, portanto, precisava de uma solução puramente baseada em SQL (sem procedimentos armazenados) para obter uma linha para cada hora em um intervalo de datas como ponto de partida para meu conjunto de resultados. Tenho certeza de que outros podem tornar isso mais elegante e modificá-lo para seus propósitos, mas para aqueles que precisam, aqui está minha solução hackeada:
Outra opção é inserir os registros de data na tabela usando um loop.
O código abaixo os adiciona a uma tabela temporária, mas isso pode ser facilmente adaptado para ser executado em um proc armazenado com uma tabela permanente.