0

除了在 sproc 中复制查询之外,有没有办法根据 sproc 参数指定提示?例如,使用 parameter @waitForLock,如果它设置为 0 我想使用READPAST提示,否则等待/阻塞直到另一个事务完成。

4

1 回答 1

1

总的来说,我喜欢这个OPTION RECOMPILE建议,尽管这意味着它每次都会重新编译,即使 stats 或你的参数没有改变。这通常是为了阻止参数嗅探,对于想要避免或不避免锁定的情况没有帮助。

一种想法是使用动态 SQL(这也可能是有益的,具体取决于您的“针对临时工作负载进行优化”设置以及使用一个参数或另一个参数运行的频率)。

CREATE PROCEDURE dbo.whatever
    @waitForLock BIT = 1
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE @sql NVARCHAR(MAX);

   SET @sql = 'SELECT something FROM dbo.somewhere';

   IF @waitForLock = 0
      SET @sql = @sql + ' WITH (READPAST)';

   SET @sql = ' WHERE <some condition> ...';

   EXEC sp_executesql @sql;
END
GO
于 2012-06-08T23:01:50.513 回答