Saya ingin membuat prosedur tersimpan yang akan membuat baris dalam tabel untuk setiap hari dalam rentang tanggal tertentu. Prosedur Tersimpan menerima dua input - Tanggal mulai dan tanggal akhir dari rentang tanggal yang diinginkan oleh pengguna.
Jadi, katakanlah saya punya tabel seperti ini:
SELECT Day, Currency
FROM ConversionTable
Hari adalah DateTime, dan Mata uang hanyalah bilangan bulat.
Agar semuanya sederhana, anggap saja saya selalu ingin kolom Mata Uang menjadi 1 untuk setiap baris yang disisipkan ini. Jadi, jika seseorang memasukkan '5 Maret 2017' sebagai tanggal mulai dan '11 April 2017' sebagai tanggal akhir, saya ingin baris-baris berikut dibuat:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
Apa cara terbaik untuk mengkode prosedur tersimpan untuk melakukan ini? Saya menggunakan SQL Server 2008 R2 di lingkungan pengujian saya, tetapi lingkungan nyata kami menggunakan SQL Server 2012, jadi saya dapat memutakhirkan mesin pengujian saya jika ada fungsi baru yang diperkenalkan pada 2012 yang membuat tugas ini lebih mudah.
MAXRECURSION
petunjuk ke kueri untuk diselesaikan.DATEADD(DAY, 1, theDate) < @EndDate
, Anda tidak mendapatkan akhir rentang ketika kedua nilai datetime memiliki komponen waktu yang sama. Saya memodifikasi jawaban dengan tepat, tetapi menggunakan<= @EndDate
. Jika Anda tidak ingin akhir dari nilai rentang dimasukkan, maka< @EndDate
memang akan benar.Pilihan lain adalah menggunakan Table-Valued-Function. Pendekatan ini sangat cepat, dan menawarkan sedikit lebih banyak fleksibilitas. Anda memberikan Rentang Tanggal / Waktu, DatePart, dan Penambahan. Juga menawarkan keuntungan dengan memasukkannya ke dalam CROSS APPLY
Sebagai contoh
Kembali
UDF jika Tertarik
sumber
Menggunakan pos Aaron Bertrand tentang cara membuat tabel dimensi tanggal sebagai contoh, saya membuat ini:
Anda harus dapat menempatkan jenis logika ini dalam prosedur tersimpan Anda dan menambahkan apa pun yang Anda butuhkan.
sumber
Saya harus memecahkan masalah yang sama baru-baru ini di Redshift di mana saya hanya memiliki akses baca dan karenanya membutuhkan solusi murni berbasis SQL (tidak ada prosedur yang tersimpan) untuk mendapatkan baris untuk setiap jam dalam rentang tanggal sebagai titik awal untuk set hasil saya. Saya yakin orang lain dapat membuat ini lebih elegan dan memodifikasinya untuk keperluan mereka, tetapi bagi mereka yang membutuhkan, berikut ini adalah solusi saya yang diretas:
sumber