我正在使用oracleclient
提供商。我想知道如何在查询中使用参数。
select * from table A where A.a in ( parameter).
参数应为multivalue
参数。
如何创建数据集?
答案 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。