Chciałbym utworzyć procedurę składowaną, która utworzy wiersz w tabeli dla każdego dnia w danym zakresie dat. Procedura przechowywana akceptuje dwa dane wejściowe - datę początkową i końcową zakresu dat żądanego przez użytkownika.
Powiedzmy, że mam taki stół:
SELECT Day, Currency
FROM ConversionTable
Dzień to data i godzina, a waluta to tylko liczba całkowita.
Aby uprościć sprawę, powiedzmy, że zawsze chcę, aby kolumna Waluta wynosiła 1 dla każdego z tych wstawionych wierszy. Jeśli więc ktoś wprowadzi „5 marca 2017 r.” Jako datę początkową i „11 kwietnia 2017 r.” Jako datę końcową, chciałbym utworzyć następujące wiersze:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
Jaki jest najlepszy sposób na zakodowanie procedury przechowywanej, aby to zrobić? Używam SQL Server 2008 R2 w moim środowisku testowym, ale nasze prawdziwe środowisko korzysta z SQL Server 2012, więc mogę uaktualnić moją maszynę testową, jeśli w 2012 r. Wprowadzono nową funkcjonalność, która ułatwia to zadanie.
MAXRECURSION
wskazówkę do zapytania, aby rozwiązać.DATEADD(DAY, 1, theDate) < @EndDate
, nie otrzymasz końca zakresu, gdy obie wartości daty i godziny mają ten sam składnik czasu. Odpowiednio zmodyfikowałem odpowiedź, ale używając<= @EndDate
. Jeśli nie chcesz, aby wartość końca zakresu była uwzględniana niezależnie, to< @EndDate
rzeczywiście byłaby poprawna.Inną opcją jest użycie funkcji wycenianej w tabeli. To podejście jest bardzo szybkie i oferuje nieco większą elastyczność. Podajesz zakres daty / godziny, datę i część oraz przyrost. Zaletą jest także włączenie go w APLIKACJĘ KRZYŻOWĄ
Na przykład
Zwroty
UDF, jeśli jest zainteresowany
źródło
Korzystając z postu Aarona Bertranda na temat tworzenia tabeli wymiarów daty jako przykładu, wymyśliłem to:
Powinieneś być w stanie umieścić ten typ logiki w procedurze przechowywanej i dodać wszystko, czego potrzebujesz.
źródło
Ostatnio musiałem rozwiązać podobny problem na Redshift, gdzie miałem tylko dostęp do odczytu i dlatego potrzebowałem rozwiązania opartego wyłącznie na SQL (bez procedur składowanych), aby uzyskać wiersz dla każdej godziny w zakresie dat jako punkt wyjścia dla mojego zestawu wyników. Jestem pewien, że inni mogą uczynić to bardziej eleganckim i zmodyfikować do swoich celów, ale dla potrzebujących, oto moje zhakowane rozwiązanie:
źródło