2013-12-17 64 views
-1

我有以下存儲過程:SQL Server存儲過程的隨機故障

CREATE PROCEDURE [dbo].[sp_cache_remove] 
@Key NVARCHAR(450) 
AS 
BEGIN 

--Clean up first 
DELETE FROM Cache WHERE Expire <= GETUTCDATE() 

DECLARE @Result NVARCHAR(MAX) 
SELECT TOP 1 @Result = Value 
FROM Cache 
WHERE [Key] = @Key AND 
    Expire > GETUTCDATE() 

DELETE FROM Cache WHERE [Key] = @Key 

SELECT @Result 

END 

這一個隨機失敗。當我將第一行註釋掉(DELETE FROM...)時,它工作正常。這隻發生在生產服務器上,因此獲取更多錯誤細節是不可能的。有人可以在這裏找出任何可能的問題嗎?

編輯:還有其他存儲過程添加,獲取等可能有死鎖或什麼?

+0

定義 「失敗」。我能看到的唯一的錯誤是沒有ORDER BY – LoztInSpace

+0

的「TOP」。注意:你不應該爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

@LoztInSpace:我有一個try/catch塊,它捕獲一個SqlException,並顯示它失敗。 TOP不應該是一個問題,因爲我有一個WHERE子句,[Key]是主鍵。 –

回答

1

您檢索什麼都嘗試initaliazed的@Result

CREATE PROCEDURE [dbo].[sp_cache_remove] 
@Key NVARCHAR(450) 
AS 
BEGIN 

--Clean up first 
DELETE FROM Cache WHERE Expire <= GETUTCDATE() 

DECLARE @Result NVARCHAR(MAX) 
    set @Result = ''  -- <---- Initialized variable 
SELECT TOP 1 @Result = Value 
FROM Cache 
WHERE [Key] = @Key AND 
    Expire > GETUTCDATE() 

DELETE FROM Cache WHERE [Key] = @Key 

SELECT @Result 

END 
+0

如果我只是調用存儲過程進行測試,即使沒有如您所示的初始化結果,它也可以正常工作。所以我不認爲這是必要的。 –

+0

當它拋出異常時,你在哪裏調用存儲過程? – Jade

+0

所有這些存儲過程(添加,獲取,刪除等)被稱爲非常隨機。它們從應用程序的不同部分被調用。 –