我有一个名为VoucherType的参数,它可以在运行时由用户选择多个值。表格中有一个名为Voucher的字段,以VoucherType开头,以一系列我不关心的数字结束。例如:
我必须启动的SQL查询如下所示:
SELECT VOUCHER, COST
FROM VOUCHERDATA
WHERE VOUCHER LIKE @VoucherType + '%';
但是,它不支持用户选择多个值。当他们尝试选择多个值时,会收到以下消息:
数据集'Dataset1'的查询执行失败。 ','。
附近的语法不正确
我确定这是因为@VoucherType现在是一个以逗号分隔的列表,但我不知道如何处理它。
任何帮助将不胜感激,谢谢!
**注意:由于外部限制,表格更改不可行。
答案 0 :(得分:1)
听起来您将数据存储在First Normal Form(一个字段中有多个数据元素),因为您在同一字段中有凭证类型和数字。您可能希望将数据规范化为两列:VoucherType和VoucherID,它们将按如下方式存储:
VoucherType | VoucherId
------------------------------
MKE 3849284
MKE 4173942
ORD 1654951
LAX 8798484
现在您有一个适当的报告列。为方便起见,您可以创建一个计算字段来连接VoucherType + '-' + VoucherId
以进行需要完整凭证信息的查询。
答案 1 :(得分:1)
我最终通过解析等式左边的VoucherType来解决这个问题:
SELECT VOUCHER, COST
FROM VOUCHERDATA
WHERE LEFT(VOUCHER,CHARINDEX('-',VOUCHER,1)-1) IN (@VoucherType);
解析后,我可以正确使用IN
关键字。
答案 2 :(得分:0)
在这种情况下你可以做两件事。
首先你是对的,它不接受它,因为它现在是一个逗号分隔的列表。
基本上你需要做的是解析逗号分隔列表并在主查询中使用带有IN子句的函数。这是一篇非常好的文章,解释了如何做到这一点:
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/ssrs_multi_value_parameters
否则,另一种方法是返回SQL代码中的所有内容并在SSRS端进行过滤。执行此操作的方法是删除SQL中的where子句,以过滤您的凭证。这将带回所有优惠券。在SSRS中,然后以与通常对多选参数相同的方式设置参数。然后在SSRS设计视图中,右键单击表格并转到属性。然后有一个名为filters的选项卡。您可以在此处设置过滤器,说明不显示这些凭证。基本上它隐藏了它们。
我解释的第一种方式绝对是最好的方法,因为它更快,可以长期重复使用。一旦设置了所有功能,它就非常简单。