2013-12-17 3 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

Боковое примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (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

Все эти хранимые процедуры (добавление, получение, удаление и т. Д.) Называются довольно случайными. Откуда они вызваны из разных частей приложения. –

Смежные вопросы