需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理

Posted

技术标签:

【中文标题】需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理【英文标题】:Need explanation of how passing s-s-rS multi-value parameters to SQL works 【发布时间】:2017-04-25 14:39:58 【问题描述】:

我从不再在公司工作的人那里继承了几份 s-s-rS 报告。报告将多值参数传递给 SQL 存储过程。然后,该 SP 使用 WHERE 子句中的拆分函数来读取值。在某些参数上,s-s-rS SP 使用Join(Parameters!field.Value,",") 以便正确地将字符串值传递给 SQL。但它并没有对所有的多值参数执行此操作。

有人可以解释为什么在某些多值参数中需要Join() 而在其他参数中不需要?我最近不得不调试一份没有填充所有数据的报告,发现我需要添加Join()。但没有它,其他报告似乎也能正常工作。

【问题讨论】:

答案在于Join()函数是如何定义的。 你能再具体点吗? 总是使用同一个 SP 吗?我猜想当 SP 执行 SPLIT() 时总是需要 JOIN() ... 它并不总是相同的 SP,但它们看起来并没有太大的不同,它们都使用 SPLIT()。我还认为 JOIN() 总是需要的,但我发现没有 JOIN() 的地方。我想在使用 SPLIT() 时我应该始终使用 JOIN()。 【参考方案1】:

在将多值参数传递给只接受该字段的 1 个参数的存储过程时需要加入。 When only one option from a list is selected no join is required, but when selecting multiple values they need to be joined into a single parameter, passed into the stored procedure, and then split inside the stored procedure.如果需要单独处理不同的值,则只需要在存储过程中拆分一次。

我会推荐阅读this article on passing multi-value parameters to stored procedures。

【讨论】:

我仍然不确定为什么某些多值参数使用 Join() 而其他参数不使用。如果用户选择多个值,那么我会期望一个 Join(),但这里并非总是如此。我正在使用的 SP 都以相同的方式编写并且都使用相同的拆分功能。 我需要查看来自 s-s-rS 的语句和多选的数据类型。【参考方案2】:

我不确定我是否理解你的问题。为什么不将 SP 更改为 Where IN (@var) 摆脱分裂。

【讨论】:

因为 s-s-rS 将为多选中选择的每个变量传递一个单独的变量,但存储过程需要特定数量的变量。您可以将变量默认为 null 并将逻辑放入 SP 以忽略 null 变量,但更容易将它们连接起来,将它们作为一个传递,然后在 SP 中拆分它们。 更改 SP 以期望该变量的 varchar(max)。而不是为每个独立值一遍又一遍地运行 sp。 如果你从一个多选中选择了“a”、“b”和“c”并加入它,它作为“a、b、c”传递。现在使用 IN 子句将仅与选定的 ulti-select 值的单个合并值进行比较。在比较 INT 和日期时也很困难。就是 IN ('a, b, c') 和 IN ('a', 'b', 'c') 的区别。 很抱歉我无法提供帮助。它对我有用。但我们并不知道所涉及的所有变量。 安德鲁的解释很到位。我不能只将 IN(@var) 与 s-s-rS 一起使用。

以上是关于需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理的主要内容,如果未能解决你的问题,请参考以下文章

URL 未将参数传递给 s-s-rS 报告

为啥 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL?

将查询字符串参数传递给 s-s-rS 报告

将一个表字段作为参数传递给 s-s-rS 报告中的另一个表

将 xml 数据作为存储过程的参数传递给 s-s-rs

将凭据传递给 Sql Report Server 2008