当前位置: 首页 > 面试题库 >

已知问题?:SQL Server 2005存储过程无法使用参数完成

谢雅珺
2023-03-14
问题内容

基本SP带有默认参数:

ALTER PROCEDURE [usp_debug_fails]
    @DATA_DT_ID AS int = 20081130
WITH RECOMPILE
AS
BEGIN
    /*
        Usage:
        EXEC [usp_debug_fails] WITH RECOMPILE
    */
    -- Stuff here that depends on DATA_DT_ID
END

具有本地编码的相同SP。

ALTER PROCEDURE usp_debug_works]
WITH RECOMPILE
AS
BEGIN
    /*
        Usage:
        EXEC [usp_debug_works] WITH RECOMPILE
    */

    DECLARE @DATA_DT_ID AS int
    SET @DATA_DT_ID = 20081130
    -- Stuff here that depends on DATA_DT_ID
END

您可以看到我在(冗余,偶数)WITH RECOMPILE选项中的位置,以避免出现参数嗅探(这在开发正常的情况下从来没有必要)

一个工作一两分钟就可以很好地完成,另一个则永远不会完成-只是坐在那里几个小时。

开发服务器(内部版本9.00.3282.00)上从未发生此问题,生产服务器是内部版本9.00.3068.00

我从proc中删除了所有代码,以尝试降至仍然存在问题的最低版本,并且非常小心地将两个版本的SP保持相同,除了一个参数。

我还有很多其他带参数的SP,它们运行得很好。我还DROPCREATE了一下,然后重新播放了SP。

有任何想法吗?

是的,我有一个DBA在查看它,我没有SHOWPLAN或生产中的任何有用权利来查看是否存在阻塞(如果我的计划导致锁定升级,我想,同样,唯一的区别是参数)

我已经查看了所有SQL Server构建信息,并且没有看到有关此问题的已知问题,因此,在我弄清楚它或DBA弄清楚它之前,我有点被卡住了。

更新

这也无法完成(这实际上是这些SP的正常形式-我只是添加了一个默认值,以使其在测试期间来回切换更加容易)

ALTER PROCEDURE [usp_debug_fails]
    @DATA_DT_ID AS int
WITH RECOMPILE
AS
BEGIN
    /*
        Usage:
        EXEC [usp_debug_fails] 20081130 WITH RECOMPILE
    */
    -- Stuff here that depends on DATA_DT_ID
END

但是,此操作完成了(这可以作为一种解决方法,尽管我要修改其中大约25个具有相同格式的SP):

ALTER PROCEDURE [usp_debug_fails]
    @DATA_DT_ID_in AS int
WITH RECOMPILE
AS
BEGIN
    /*
        Usage:
        EXEC [usp_debug_fails] 20081130 WITH RECOMPILE
    */

    DECLARE @DATA_DT_ID AS int
    SET @DATA_DT_ID = @DATA_DT_ID_in
    -- Stuff here that depends on DATA_DT_ID
END

问题答案:

尝试掩盖输入参数。

我猜因为在编译时嗅到了指定的默认值( EDIT :或首次调用时发送的参数),所以重新编译无法正常进行。因此,重新编译无效。

我已经看到了估计的计划之间的巨大差异,只需将默认值(例如,从零更改为NULL或不包含一个)就可以了。

ALTER PROCEDURE [usp_debug_mightwork]
    @DATA_DT_ID AS int = 20081130
AS
BEGIN
    DECLARE @IDATA_DT_ID AS int
    SET @IDATA_DT_ID = @DATA_DT_ID
    -- Stuff here that depends on IDATA_DT_ID
END

我认为这篇文章解释了…

…在编译或重新编译期间会嗅探参数值…

编辑:

有关查询计划和参数的新链接。仍然是参数嗅探是否指定了默认值。

上面的GetRecentSales存储过程中指定的WITH RECOMPILE选项不能消除基数估计错误

有关常量和计划的相关文章种类



 类似资料:
  • mYSQL存储过程的错误: 存储过程如下: 报错:Procedure execution failed 1054 - Unknown column '王小李' in 'field list' 只要传值进去就报字段不在列表中,当我把 DataName 改成int 整型的时候运行可以,当为字符串运行就报错。请教高手要这么处理?

  • 关于如何使用传递的参数的任何线索。

  • 问题内容: 编译我的项目时,出现以下错误消息: 要么 在Gradle Log中使用以下stacktrace 问题答案: Firebase对SDK进行了更新: Firebase Android SDK现在具有独立的版本号,可以进行更频繁,更灵活的更新。 更新所有Firebase依赖项以使用最新版本: 更多信息在这里: https://firebase.google.com/support/relea

  • 问题内容: 我已经使用PDO一段时间了,并且正在重构一个项目,以便它使用存储的proc而不是内联SQL。我收到一个我无法解释的错误。我正在使用PHP版本5.3.5和MySQL版本5.0.7。 我只是想获得一个带有输出的基本存储过程。这是存储的过程: 这是我用来调用proc的代码,$ db是PDO的一个实例: 简单吧?但是,它导致以下错误: 如果我直接这样调用proc: 它按预期工作,这使我相信PH

  • 问题内容: 我偶然发现了一个问题,无法自己解决。希望有人可以帮助我解决它。 因此,我在SQL Server 2005数据库中有一个简单的存储过程 以及在应用程序中带有和控件的asp.net页(VS2008) 如您所见,代码很简单。但是,如果我不麻烦在url上指定大头针(而不是)或指定空行(),则不会调用存储过程(我使用SQL Server Profiler对其进行了检查)。 而且,如果我用一个简单

  • 问题内容: 我希望能够在PetaPoco中使用命名参数调用存储的proc。 为了调用执行搜索/获取的存储过程: 我可以做这样的事情: 另外,如何调用执行插入操作的存储过程? 谢谢,Nac 问题答案: 更新: 我尝试了以下操作来进行获取和插入,并且效果很好: 可以进一步改进以传递SQL参数。