sql查询中的参数:SSRS

时间:2009-02-13 19:06:07

标签: oracle reporting-services parameters

我正在使用oracleclient提供商。我想知道如何在查询中使用参数。

select * from table A where A.a in ( parameter).

参数应为multivalue参数。

如何创建数据集?

6 个答案:

答案 0 :(得分:1)

简单。将参数添加到报告中,并确保将其作为多值检查。然后在数据选项卡中输入并编辑查询,单击“...”按钮编辑数据集。在参数选项卡下创建一个映射参数,使其看起来像这样(显然你的参数名称不同):

@ids | =Parameters!ContractorIDS.Value

然后在查询选项卡中使用coorelated子查询,就像上面的示例一样。我已经使用SQL服务器多次这样做了,因为SSRS将构建一个符合ANSI标准的SQL语句,它将无法与Oracle一起使用,它将传递给Oracle。

where A.myfield in (@ids)

答案 1 :(得分:1)

你不能直接在oracle中列出变量。但是,您可以将逗号分隔列表拆分为可在子查询中使用的行。字符串txt可以用逗号分隔的任意数量的值替换。

   select * from a where a.a in ( 
       SELECT regexp_substr(txt,'[^,]+',1,level)
         FROM (SELECT 'hello,world,hi,there' txt  -- replace with parameter
                 FROM DUAL)
   CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (txt, '[^,]'))+1
   )

查询的工作原理是首先计算文本字符串中逗号的数量。它通过使用reqular表达式删除所有非逗号然后计算余数的长度来实现此目的。

然后使用Oracle“技巧”从双表中返回该数字+ 1行数。然后使用regexp_substr函数拉出每个出现的内容。

答案 2 :(得分:1)

首先在使用Oracle OLEDB连接的SSRS中,您需要使用冒号,而不是@符号,例如:参数不是@parameter但是你不能将它作为一个多值参数来做,它只接受单个值。更糟糕的是,如果您使用ODBC连接,则必须单独使用问号,例如?不是@parameter,然后参数的排序变得很重要,它们也不能是多值的。剩下的唯一方法是使用表达式构造查询(param的join()函数)或调用存储过程。

存储过程选项是最好的,因为SSRS可以非常干净地处理SQL Server和Oracle的存储过程的参数,但是如果这不是一个选项,你可以使用这个表达式:

="select column1, column2, a from table A where A.a in (" + Join(Parameters!parameter.Value,", ") + ")"

或者,如果参数值是需要围绕它们的撇号的字符串:

="select column1, column2, a from table A where A.a in ('" + Join(Parameters!parameter.Value,"', '") + "')"

右键单击数据集时,可以选择“数据集属性”,然后使用fx按钮将查询编辑为表达式,而不是使用不允许将其编辑为表达式的查询设计器。

此表达式方法限制为大约1000个值的最大限制,但如果你有这么多,这是错误的方法,你宁愿加入一个表。

答案 3 :(得分:0)

我不认为你可以在这种情况下使用参数。 (除非oracle和您使用的语言支持数组类型参数?)

答案 4 :(得分:0)

oracle中的参数被定义为“:parametername”,所以在你的查询中你应该使用类似的东西:

select * from table A where value in (:parametername)

将参数添加到报告中的参数文件夹中,并选中“允许多个值”复选框。

答案 5 :(得分:0)

正如Victor Grimaldo所说......下面对我很有用。我在SSRS dataset1中的SQL查询中使用:parameter时,它要求我输入这些参数的值,我选择已经创建了SSRS参数。

SELECT * FROM table a WHERE VALUE IN (**:parametername**)

谢谢Victor。