2012-06-08 23 views
0

其他在sproc中複製查詢的其他方法,有沒有什麼方法可以根據sproc參數指定提示?例如,使用參數@waitForLock,如果它設置爲0,我想使用READPAST提示,否則等待/阻止,直到其他事務完成。sproc中的條件提示

+0

我還沒有見過這樣的事情。我希望你需要一個帶有2個查詢的IF/ELSE(一個帶鎖,一個沒有) – Joe

+1

@Joe:是的,我想到了2個查詢,因爲明顯的'CASE'聲明不起作用。如果這是另一種提示(例如'NOLOCK'),也許你可以做一個條件隔離級別:'IF @nolock = 1 SET TRANSACTION ISOLATION READ UNCOMMITTED ELSE SET TRANSACTION ISOLATION READ COMMITTED' ...然後做你的查詢。 –

回答

0

一般來說,我喜歡OPTION RECOMPILE建議,儘管這意味着每次都會重新編譯,即使統計信息或參數沒有改變。這通常是爲了阻止參數嗅探,而不是幫助您想避免或避免採取鎖定的情況。

一個想法是使用動態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 
+0

的確,我沒有想過動態SQL,但那會工作。我最終意識到在我的具體實現中,等待另一個事務(不執行'READPAST')確實沒有幫助。第一個交易會更新列值,這意味着我無法得到結果,所以我不妨儘早退出。唯一的例外是如果第一個事務回滾,這隻會發生在錯誤,並且不太可能。 –