2012-01-31 60 views
1

我已经阅读了大量有关参数嗅探存储过程和解决方法的文章(特别是在这里)。例如,这里:http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/参数嗅探和嵌套存储过程

这是否也适用于由另一个存储过程调用的存储过程?即链接文章中描述的解决方案是否也适用于嵌套存储过程。

此外,如果您在调用存储过程中声明一个名为@PersonID的变量,是否可以在被调用的存储过程中Decalre称为@PersonID的变量,即DECLARE PersonID int。这将是可变的阴影。

回答

2

是第一个。每个存储过程是分开的,您需要在每个存储过程中应用反嗅探技术(参数掩码或更新的OPTIMISE FOR UNKNOWN)。

对第二个是,但不是您为什么这么想。变量在该存储过程中仅有的范围。所以被调用者中的@PersonID与调用者中的@PersonID无关。如果你在被调用者中没有@PersonID,那么你的父亲不在范围内

+0

谢谢。因此,如果我在存储过程2中存储过程1和PersonID = 2中声明了PersonID = 1,那么在控制从存储过程2传回存储过程1后,是否可以确认PersonID等于1?是否存在使用相同变量的风险名称? – w0051977 2012-01-31 13:35:40

+0

是的,PersonID = 1将保留在proc 1中。proc 2的内部没有任何影响。想想你的.net或java方法和“封装”。没有风险,如果它是有道理的。你的嵌套过程是一种方法,可以单独调用 – gbn 2012-01-31 13:39:51

+0

谢谢。我几乎准备好回答这个问题。我在显式事务中使用'XACT_ABORT ON'来确保事务在存储过程出错时回滚。因此,如果VB6命令对象(这将调用存储过程)存在超时,或者存储过程引发异常;该计划将处理它。我最近才发现:'XACT_ABORT ON'。从VB6程序调用存储过程时还有什么我应该考虑的吗? – w0051977 2012-02-01 13:43:46