2011-12-13 54 views
2

我记得读了一段时间后,它随机SQL Server可以减缓和/或采取一个愚蠢长的时间来执行存储过程时,它是这样写的:问题在SQL Server存储过程的参数

CREATE PROCEDURE spMyExampleProc 
(
    @myParameterINT 
) 
AS 
BEGIN 

    SELECT something FROM myTable WHERE myColumn = @myParameter 

END 

解决这个错误的方法是做到这一点:

CREATE PROCEDURE spMyExampleProc 
(
    @myParameterINT 
) 
AS 
BEGIN 
    DECLARE @newParameter INT 
    SET @newParameter = @myParameter 

    SELECT something FROM myTable WHERE myColumn = @newParameter 
END 

现在的问题是,首先是它不好的做法,遵循我的所有存储过程的第二个例子吗?这看起来像是一个可以在很少工作的情况下很容易防止的bug,但是这样做会有什么缺点,如果是的话,为什么?

当我读到这个问题时,相同的过程需要不同的时间来执行取决于参数的值,如果任何人都可以告诉我这个问题被称为/为什么会发生,我会非常感激,我似乎无法找到任何地方的帖子链接,这似乎是我们公司可能发生的问题。

+0

我从来没有听说过一个问题,但如果是这样的话,可能是由于存储过程的预编译。也许在查询中使用参数会阻止优化存储过程。 – Russell

+0

@Russell我有同样的意见。 –

+0

@Russell它不是我曾经听说过的问题,我确实认为这是由于预编译而引起的,但我不记得确切的细节。我只是问现在,因为我移动了大量的查询到存储过程中,它似乎是一个可以很容易地阻止,即使它是一个罕见的bug工作很少 – Purplegoldfish

回答

5

你总是可以使用这种屏蔽模式,但它并不总是需要的。例如,一个简单的按唯一键选择,没有子表或其他过滤器应该每次都按预期行事。

由于SQL Server 2008,您还可以使用OPTIMISE FOR UNKNOWN (SO)。另见Alternative to using local variables in a where clauseExperience with when to use OPTIMIZE FOR UNKNOWN

+0

真棒回答非常感谢,我会检查出这些链接,并将其标记为可以接受。 – Purplegoldfish