SSRS多选参数和类似语句

时间:2011-08-10 19:45:48

标签: sql sql-server-2008 reporting-services

我有一个名为VoucherType的参数,它可以在运行时由用户选择多个值。表格中有一个名为Voucher的字段,以VoucherType开头,以一系列我不关心的数字结束。例如:

VoucherTypes

  • MKE
  • ORD
  • LAX

  • MKE-3849284
  • MKE-4173942
  • ORD-1654951
  • LAX-8798484

我必须启动的SQL查询如下所示:

SELECT VOUCHER, COST
FROM VOUCHERDATA
WHERE VOUCHER LIKE @VoucherType + '%';

但是,它不支持用户选择多个值。当他们尝试选择多个值时,会收到以下消息:

  

数据集'Dataset1'的查询执行失败。 ','。

附近的语法不正确

我确定这是因为@VoucherType现在是一个以逗号分隔的列表,但我不知道如何处理它。

任何帮助将不胜感激,谢谢!

**注意:由于外部限制,表格更改不可行。

3 个答案:

答案 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的选项卡。您可以在此处设置过滤器,说明不显示这些凭证。基本上它隐藏了它们。

我解释的第一种方式绝对是最好的方法,因为它更快,可以长期重复使用。一旦设置了所有功能,它就非常简单。