将函数转换为存储过程

时间:2011-05-10 19:25:48

标签: sql

我正在使用一个应用程序,该应用程序在数据层中的WHERE个子句中都有用户功能,我确信它会导致性能问题。

作为一个例子,假设有一个报告提取条目和评论,并且有一个功能

where (dbo.CountComments(entries.id, '5/10/2011') = 0)

...让我们说,今天没有评论的条目。

我想将其转换为存储过程,但似乎从存储过程中获得相同的行为几乎是不可能的。

如果您必须将其重写为SP,您会怎么做?

3 个答案:

答案 0 :(得分:2)

一些想法。

首先,使用COUNT = 0来找出没有任何东西是低效的。你最好使用

NOT EXISTS (SELECT...)

这样一旦SQL找到一行返回false就可以保释,而不必访问所有这些行以返回非零计数。

其次,您在查询中使用此功能的位置是什么?如果你不想像在你的例子中那样使用它的输出作为查询条件,那么你将无法使用存储过程来做到这一点。

我发现自己正在做的是为常用查询编写函数或视图,然后在我想返回它们返回的行时将它们中的一些包装在存储过程中。如果我必须将结果与其他表或视图相结合,最好将它们保留为函数。

答案 1 :(得分:0)

您可以尝试使用基本SQL。也许类似于以下内容:

SELECT   *
FROM     comments c
WHERE    NOT EXISTS(SELECT commentID FROM comments c2 WHERE dateCreated >= getDate() AND c.commentID = c2.commentID)

这比在几个级别上使用函数更有效。但是我正在对你想要完成的事情做一些基本的假设,所以我完全有可能离开标记。

答案 2 :(得分:0)

如果将其重写为存储过程,则不能在WHERE子句中使用它。只有函数才能提供这种能力。

但是,如果您从函数中获取代码并将其放入存储过程中,然后将日期作为参数传递,您将能够获得类似于现在的结果,除非您正在进行所以使用存储过程。