Làm cách nào để vượt qua các ký tự đa giá trị trong Báo cáo SSRS?


8

Tôi có một báo cáo SSRS có 3 bộ dữ liệu cung cấp một nguồn dữ liệu. Tập dữ liệu chính là một thủ tục được lưu trữ đang tổng hợp một số dữ liệu dựa trên một tập các tham số được cung cấp bởi hai bộ dữ liệu khác.

Thủ tục lưu trữ chính cung cấp năng lượng cho báo cáo này có 4 tham số. Một là ID cho loại dữ liệu, hai là cho ngày bắt đầu và ngày kết thúc và thứ ba chỉ là một tham số cờ. Tham số cờ là tham số đa giá trị nơi tôi muốn chuyển nhiều giá trị cờ cũng là giá trị VARCHAR.

Trong thủ tục lưu trữ của tôi cho tham số @Flag của tôi, tôi có điểm chung:

WHERE [Flag] IN (@Flag)

Sau đó, tất nhiên, tham số @Flag trên báo cáo SSRS được đặt để cho phép 'Nhiều giá trị' cũng được điền từ truy vấn đang kéo các giá trị @Flag đó từ bảng thứ nguyên.

Vấn đề của tôi

Trong hầu hết các trường hợp khi xử lý các giá trị INT, sử dụng cùng một kỹ thuật hoạt động. Tuy nhiên, khi tôi xử lý các giá trị nhân vật, nó thất bại. Nếu tôi chọn một cờ, báo cáo sẽ hoạt động một cách kỳ diệu. Nếu tôi chọn nhiều cờ, nó dường như không chuyển các cờ chính xác cho quy trình được lưu trữ và không có kết quả nào trả về.

Khi kiểm tra cờ đa giá trị trực tiếp trong quy trình được lưu trữ:

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

Các thủ tục lưu trữ hoạt động chính xác. Vì vậy, vấn đề không phải là thủ tục được lưu trữ, mà là cách SSRS truyền các giá trị đa giá trị cho tham số @Flag.

Giải pháp đã thử

Tôi đã thử thực hiện các điều chỉnh sau đây cho bộ dữ liệu SSRS cho tham số @Flag này:

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

Va cai nay cung vay:

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

Tất cả đều hoạt động trên các giá trị đơn lẻ, nhưng không bao giờ đa giá trị.

Tôi đang thiếu gì ở đây?

Câu trả lời:


7

Tôi tìm thấy một giải pháp. Tôi đã không phân chia đúng các giá trị trong thủ tục được lưu trữ bằng UDF.

Để truyền chính xác nhiều giá trị trong quy trình được lưu trữ này, tôi cần thêm đoạn mã sau vào tham số bộ dữ liệu mà tôi đang sử dụng:

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

Điều này về cơ bản sẽ nối nhiều giá trị vào một mảng và chuyển nó qua @Flagtham số. Bước tiếp theo là thêm SQL vào thủ tục được lưu trữ để nhận và tiêu hóa chính xác các giá trị để nó đọc các giá trị với INmệnh đề.

Google tìm kiếm bất kỳ trình phân tích cú pháp chuỗi UDF trực tuyến. Có nhiều lựa chọn. Tôi đã sử dụng dba_parseString_udftừ Michelle Ufford http://sqlfool.com .

Khi tôi đã cài đặt UDF, bây giờ tôi có thể thay đổi INmệnh đề của mình để nhận tham số đa giá trị mới được SSRS thông qua như sau:

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

Do đó, SSRS sẽ vượt qua giá trị sau:

@Flag = 'A,B,C'

Sau đó UDF của tôi sẽ phân tích chính xác chuỗi đó thành:

A
B
C

Và điền @Flagchính xác tham số của tôi vớiSELECT * FROM UDF()...


Trong trường hợp điều này giúp bất kỳ ai khác: biểu thức nối ( =join(Parameters!<your param name>.Value,",")) có thể được thêm vào tập dữ liệu đang đọc tham số, trong tab "Tham số": có nút "fx" để thêm biểu thức, ở bên phải thả "Giá trị tham số" -xuống.
Doug_Ivison

Ngoài ra, thay vì tạo UDF để phân tích cú pháp, nếu giá trị cơ sở dữ liệu và giá trị tham số là duy nhất đáng tin cậy và không bao giờ là tập hợp con của nhau, thì tôi bỏ qua phân tích cú pháp và chỉ sử dụng CHARINDEX: ví dụ: nếu mã để đọc tham số trong SQL nhúng : WHERE <Table>.[<Column>] IN (@MultiValueParm), sau đó mã trong quy trình được lưu trữ có thể làWHERE CHARINDEX(<Table>.[<Column>], @MultiValueParmAsText) > 0
Doug_Ivison

Hỏi đáp tuyệt vời, cảm ơn! FYI, SQLFool.com dường như ngừng hoạt động. Hàm ParseString () có thể được tìm thấy tại: github.com/MichelleUfford/sql-scripts/blob/master/dev/ phỏng
J Weezy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.