2

我有一个经常调用的存储过程,因为它用于检索帐户对帐单。实际存储过程在 MSSMS 的查询窗口中大约需要 10 毫秒,并且通常运行良好,但有时会在我的 VB6 应用程序中决定超时(超时设置为 120 秒)。SP 连接 2 个数据库之间的表,一个包含当前事务 (DB #1),另一个包含存档事务 (DB #2)。使用“sp_who2”,似乎没有 SPID 占用或阻塞系统。

这是我设置的 SQL 变量:

DECLARE @rtnRecs int;
strSQL = "EXEC spA_StatementData 
        @sAccountNr = '123abc', 
        @bIncludeHistory = 1, 
        @bShowAllTransactions = 1, 
        @iValidRecords = @rtnRecs OUTPUT"

我在VB6中使用的方法是:

rs.Open sql, con, adOpenStatic

其中 rs 是 ADODB.Recordset,con 是到数据库的连接。

这段代码在很长一段时间内运行良好,比如 2 个月,并被多个运营商使用。然后它突然无缘无故地停止工作 - 但在 MSSMS 中仍然可以正常工作。我强调的是 VB6,因为那是问题首次出现的地方,但同样的事情也发生在我的 VB.net 代码中。

需要注意的一点是,“@bIncludeHistory”参数是将 JOIN 设置为存档数据库 (DB #2) 的条件。当 '@bIncludeHistory' 设置为 0 时,不会发生超时。

重置服务可以解决问题,但只能作为最后的手段。还有什么我可以尝试的吗?谢谢

4

2 回答 2

0

当心存储过程中的参数嗅探。尝试这个

CREATE PROC spA_StatementData (
        @sAccountNr             VARCHAR(1000)
        , @bIncludeHistory      BIT
        , ...
) AS
SET NOCOUNT ON

DECLARE @_sAccountNr            VARCHAR(1000)
        , @_bIncludeHistory     BIT
        , ...

--- prevent parameter sniffing
SELECT  @_sAccountNr = @sAccountNr
        , @_bIncludeHistory = @bIncludeHistory
        , ...

--- use local @_sAccountNr, @_bIncludeHistory, etc. instead of parmeter variables
于 2013-01-30T15:31:48.220 回答
0

同样的问题发生在我身上,我错过了STORE PROCEDURE中的以下代码

SET NOCOUNT ON

希望这可以帮助。确保您的 SP 有此代码。

于 2013-12-25T08:00:26.790 回答