Saya mencoba men-debug laporan SQL orang lain dan telah menempatkan kueri laporan yang mendasarinya ke jendela kueri SQL 2012.
Salah satu parameter yang diminta oleh laporan adalah daftar bilangan bulat. Hal ini dicapai pada laporan melalui kotak tarik turun multi-pilih. Kueri yang mendasari laporan menggunakan daftar integer ini dalam where
misalnya klausa
select *
from TabA
where TabA.ID in (@listOfIDs)
Saya tidak ingin mengubah kueri yang saya debug, tetapi saya tidak tahu cara membuat variabel pada SQL Server yang dapat menampung jenis data ini untuk mengujinya.
misalnya
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Tidak ada tipe data yang dapat menyimpan daftar bilangan bulat, jadi bagaimana cara menjalankan kueri laporan di SQL Server saya dengan nilai yang sama dengan laporan?
sql-server
list
tsql
variables
reporting-services
ErickTreetops
sumber
sumber
Jawaban:
Variabel tabel
atau
sumber
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
Kueri ini akan mengembalikan beberapa ID dan saya mendapatkan kesalahan mengatakan subquery mengembalikan lebih dari satu hasil dan itu tidak diizinkan. Apakah ada pula untuk membuat variabel yang akan menyimpan array jika ID dari subquery?Dengan asumsi variabel adalah sesuatu yang mirip dengan:
Dan Prosedur Tersimpan menggunakannya dalam bentuk ini:
Anda dapat membuat IntList dan memanggil prosedur seperti ini:
Atau jika Anda menyediakan IntList sendiri
sumber
Anda benar, tidak ada datatype di SQL-Server yang dapat menampung daftar bilangan bulat. Tetapi yang dapat Anda lakukan adalah menyimpan daftar bilangan bulat sebagai string.
Anda kemudian dapat membagi string menjadi nilai integer yang terpisah dan memasukkannya ke dalam tabel. Prosedur Anda mungkin sudah melakukan ini.
Anda juga dapat menggunakan kueri dinamis untuk mencapai hasil yang sama:
sumber
Untuk SQL Server 2016+ dan Azure SQL Database, fungsi STRING_SPLIT ditambahkan yang akan menjadi solusi sempurna untuk masalah ini. Berikut ini dokumentasinya: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Berikut ini sebuah contoh:
Hasil kueri adalah 1,3
~ Ceria
sumber
Pada akhirnya saya sampai pada kesimpulan bahwa tanpa mengubah cara kerja kueri saya tidak bisa menyimpan nilai-nilai dalam variabel. Saya menggunakan SQL profiler untuk menangkap nilai dan kemudian mengkodekannya ke dalam kueri untuk melihat cara kerjanya. Ada 18 array integer ini dan beberapa memiliki lebih dari 30 elemen di dalamnya.
Saya berpikir bahwa ada kebutuhan untuk MS / SQL untuk memperkenalkan beberapa tipe data tambahan ke dalam bahasa. Array sangat umum dan saya tidak melihat mengapa Anda tidak dapat menggunakannya dalam proc yang disimpan.
sumber
Anda tidak bisa melakukannya seperti ini, tetapi Anda bisa menjalankan seluruh kueri yang menyimpannya dalam sebuah variabel.
Sebagai contoh:
sumber
Ada fungsi baru dalam SQL dipanggil
string_split
jika Anda menggunakan daftar string. Tautan Ref STRING_SPLIT (Transact-SQL)Anda dapat mengirimkan permintaan ini dengan
in
sebagai berikut:sumber
Saya menggunakan ini:
1-Deklarasikan variabel tabel temp di skrip gedung Anda:
2-Alokasikan ke tabel temp:
3-Referensi tabel ketika Anda membutuhkannya dalam pernyataan WHERE:
sumber