Bagaimana cara melewatkan karakter multi-nilai dalam Laporan SSRS?

8

Saya punya laporan SSRS yang memiliki 3 set data makan dari satu sumber data. Dataset utama adalah prosedur tersimpan yang menggabungkan beberapa data berdasarkan satu set parameter yang didukung oleh dua set data lainnya.

Prosedur tersimpan utama yang menjalankan laporan ini memiliki 4 parameter. Satu adalah ID untuk tipe data, dua untuk tanggal mulai dan berakhir dan yang ketiga hanyalah parameter flag. Parameter flag adalah parameter multi-nilai di mana saya ingin meneruskan beberapa nilai flag yang juga merupakan nilai VARCHAR.

Dalam prosedur tersimpan untuk parameter @Flag saya, saya memiliki kesamaan:

WHERE [Flag] IN (@Flag)

Kemudian tentu saja parameter @Flag pada laporan SSR diatur untuk memungkinkan 'Beberapa Nilai' yang juga diisi dari kueri yang menarik nilai-nilai @Flag dari tabel dimensi.

Masalahku

Dalam kebanyakan kasus ketika berhadapan dengan nilai INT, menggunakan teknik yang sama berfungsi. Namun, ketika saya berurusan dengan nilai karakter, itu gagal. Jika saya memilih satu bendera, laporan berfungsi ajaib. Jika saya memilih lebih dari satu flag, sepertinya tidak mengirimkan flag dengan benar ke prosedur tersimpan dan tidak ada hasil yang kembali.

Saat menguji bendera multi-nilai langsung di prosedur tersimpan:

WHERE [Flag] IN ('A', 'B', 'C')

Prosedur tersimpan bekerja dengan benar. Jadi masalahnya bukan prosedur tersimpan, tetapi bagaimana SSRS meneruskan nilai multi-nilai ke parameter @Flag.

Solusi Mencoba

Saya mencoba melakukan penyesuaian berikut untuk dataset SSRS untuk parameter @Flag ini:

=join(Parameters!<your param name>.Value,",")

DAN yang ini juga:

=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")

Ini semua bekerja pada nilai-nilai tunggal, tetapi tidak pernah multi-nilai.

Apa yang kulewatkan di sini?

Rewel
sumber

Jawaban:

7

Saya menemukan solusinya. Saya tidak benar membagi nilai dalam prosedur tersimpan dengan UDF.

Untuk meneruskan multi-nilai dengan benar dalam prosedur tersimpan ini, saya perlu menambahkan kode berikut ke parameter dataset yang saya gunakan:

=join(Parameters!<your param name>.Value,",")

Ini pada dasarnya akan menggabungkan beberapa nilai ke dalam array dan meneruskannya melalui @Flagparameter. Langkah selanjutnya adalah menambahkan SQL ke prosedur tersimpan untuk menerima dan mencerna nilai-nilai dengan benar sehingga membaca nilai-nilai dengan INklausa.

Google mencari parser string UDF online. Ada banyak pilihan. Saya menggunakan dba_parseString_udfdari Michelle Ufford http://sqlfool.com .

Setelah saya menginstal UDF saya, sekarang saya dapat mengubah INklausa saya untuk menerima parameter multi-nilai baru yang diteruskan oleh SSRS sebagai berikut:

WHERE [Flag] IN (SELECT * FROM dba_parseString_udf(@Flag, ','))

Oleh karena itu, SSR akan memberikan nilai berikut:

@Flag = 'A,B,C'

Kemudian UDF saya akan mengurai string itu dengan benar ke:

A
B
C

Dan isi @Flagparameter saya dengan benarSELECT * FROM UDF()...

Rewel
sumber
Dalam hal ini membantu orang lain: ekspresi gabungan ( =join(Parameters!<your param name>.Value,",")) dapat ditambahkan ke dataset yang membaca parameter, di bawah tab "Parameter": ada tombol "fx" untuk menambahkan ekspresi, di sebelah kanan drop "Nilai Parameter" -turun.
Doug_Ivison
Selain itu, alih-alih membuat UDF untuk diuraikan, jika nilai basis data dan nilai parameter unik dan tidak pernah subset satu sama lain, maka saya melewatkan penguraian dan hanya menggunakan CHARINDEX: misalnya, jika kode untuk membaca parameter dalam SQL tertanam adalah : WHERE <Table>.[<Column>] IN (@MultiValueParm), maka kode dalam prosedur tersimpan bisaWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison
T&J Hebat, terima kasih! FYI, SQLFool.com tampaknya turun. Fungsi ParseString () dapat ditemukan di: github.com/MichelleUfford/sql-scripts/blob/master/dev/…
J Weezy