2011-06-16 50 views
0

有没有办法写一个SQL存储过程,直到运行时才知道它有多少个参数要包含在where子句中,哪些列是那些目标?SQL存储过程未知在哪里子句

谢谢。

+0

这是什么DBMS? – 2011-06-16 20:37:22

+0

[传递SQL存储过程完整的WHERE子句](http://stackoverflow.com/questions/3085756/passing-sql-stored-procedure-entirety-of-where-clause) – 2011-06-16 20:38:05

+0

@Abe Oracle。 – 2011-06-16 20:39:05

回答

3

您可以在存储过程中构建动态sql,然后执行它。我不会推荐这样做,但它是一种选择。

如果你确实走这条路线,确保你给this article一个彻底的阅读。

更新:

声明 - 上述文章特定于SQL Server。尽管如此,其中一些可能仍然适用(我不太了解Oracle如何以某种方式说出)。

我建议看一看this article以获取有关Dynamic SQL的Oracle特定信息。

+1

只需确保在执行此操作时不会打开SQL注入漏洞。清理发送到存储过程的任何内容。 – Delebrin 2011-06-16 20:37:31

+0

对于Erland Sommarskog链接+1。 – Oded 2011-06-16 20:38:01

1

如果你有很多列,您可以通过搜索,然后构建一个动态SQL语句会更容易些,但......你不必担心SQL注入

OR

,如果你知道的列,将搜索,创建为每个列的可选参数,默认设置为NULL值分配给他们

编辑:在SQL Server中添加样本,但很容易移植到甲骨文

CREATE PROCEDURE dbo.test 
(
    @col1 varchar(50) = null, 
    @col2 int = null, 
    @col3 datetime = null 
) 
AS 

    SELECT col1, col2, col3 
    FROM someTable 
    WHERE (@col1 IS NULL OR col1 = @col1) 
    AND  (@col2 IS NULL OR col2 = @col2) 
    AND  (@col3 IS NULL OR col3 = @col3) 
+0

谢谢。我知道将被搜索的列,但我不知道每列有多少个参数。例如对于col1,可能有2个参数。这可能吗?再次感谢。 – 2011-06-16 20:57:03

+0

这是可能的,但变得更加困难。我们处理它的方式是确定哪些参数可能具有潜在的多个值并传入csv字符串。我们有一个用户定义的函数,它解析了csv并返回了一个表,然后我们进行了左连接。但在我们的例子中,只有一个参数接受多个值,因此更容易维护 – clyc 2011-06-17 03:58:55