我试图将SSRS中的参数转换为小数。我有一个in子句,因为它的多选。我可以选择1并且它运行正常但是如果我选择超过1则会说
“关键字'附近的语法错误为'。”
我在查询语句的where子句中输出参数。
WHERE LOAD_NO IN(CAST(@Load as DECIMAL))
我很困惑,如果我从列表中选择多个语法错误会导致语法错误。
由于
答案 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)
我不确定您的数据是什么样的,所以我不确定这些选项是否会有所帮助,但这里有几条建议:
尝试将CAST
改为LOAD_NO
:
WHAST CAST(LOAD_NO AS VARCHAR)IN(@Load)
创建splitString
函数,例如此处接受的帖子(T-SQL split string),并在WHERE
子句中访问它:
WHERE LOAD_NO IN(SELECT CAST(val AS DECIMAL)FROM dbo.splitString(@ Load,&#39;,&#39;))