SSRS将参数转换为十进制多选

时间:2015-07-22 07:51:08

标签: reporting-services ssrs-2012

我试图将SSRS中的参数转换为小数。我有一个in子句,因为它的多选。我可以选择1并且它运行正常但是如果我选择超过1则会说

“关键字'附近的语法错误为'。”

我在查询语句的where子句中输出参数。

WHERE LOAD_NO IN(CAST(@Load as DECIMAL))

我很困惑,如果我从列表中选择多个语法错误会导致语法错误。

由于

2 个答案:

答案 0 :(得分:1)

  

我很困惑为什么如果我这会带回语法错误   从列表中选择多个。

简短回答

因为WHERE LOAD_NO IN (CAST(1,2,N as DECIMAL))不是有效的T-SQL语句。

答案很长

在查询中使用多值参数时,如果参数包含1个值或多个值,则报告服务将生成不同的查询。

让我们将您的示例简化为以下查询:

SELECT * FROM TABLE WHERE LOAD_NO IN (@Load)

只有一个值,查询将具有以下格式:

exec sp_executesql N'SELECT * FROM TABLE WHERE LOAD_NO IN (@Load)', N'@Load int', @Load=<YourValue>

这是一个带有参数的查询:@Load

现在,使用多个值,查询将变为

exec sp_executesql N'SELECT * FROM TABLE WHERE LOAD_NO IN (<YourValue1>, <YourValue2>,<YourValueN>)'

@Load参数已被值列表替换。

所以现在我的建议是重新考虑查询的设计,并将@Load视为值列表。

我们无法为您提供最佳解决方案,因为它实际上取决于数据,只有您拥有所有细节,但我仍然可以提出一些想法。

我能想到:

  • 转而使用LOAD_NO,但执行计划可能会失去索引的好处(如果有的话)。
  • 在大多数情况下,尽可能使用IF EXISTS代替IN
  • 使用子查询。

如果您有其他问题,请不要犹豫,运行SQL Server Profiler查看生成的查询。

答案 1 :(得分:0)

我不确定您的数据是什么样的,所以我不确定这些选项是否会有所帮助,但这里有几条建议:

  1. 尝试将CAST改为LOAD_NO

    WHAST CAST(LOAD_NO AS VARCHAR)IN(@Load)

  2. 创建splitString函数,例如此处接受的帖子(T-SQL split string),并在WHERE子句中访问它:

    WHERE LOAD_NO IN(SELECT CAST(val AS DECIMAL)FROM dbo.splitString(@ Load,&#39;,&#39;))

相关问题