Хранимая процедура возвращает дубликаты результатов, в то время как при запуске sql она не работает напрямую - PullRequest
2 голосов
/ 05 августа 2011

У нас есть хранимая процедура в SQL Server 2005 со сложным битом запроса на выборку. Недавно в одной среде мы заметили, что для небольшого подмножества результатов, возвращаемых хранимым процессом, были дубликаты записей. Когда мы напрямую запустили SQL-запрос, мы получили правильный набор записей без дубликатов. Хранимая процедура использует много представлений и объединений (внутреннее соединение / левое соединение). У меня есть теория, что хранимая процедура каким-то образом использует некоторые кэшированные планы выполнения, поскольку мы недавно изменили некоторые представления, но у меня нет достаточных знаний SQL, чтобы быть уверенным в этом. У кого-нибудь есть идеи?

Спасибо за вашу помощь, Ashish

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Различные результаты могут быть вызваны разными настройками соединения (например, ansi_nulls, arith_abort и т. Д.).

0 голосов
/ 05 августа 2011

Запустите процедуру sp_recompile для хранимой процедуры, чтобы очистить кэш процедуры для этой хранимой процедуры.

Чтобы очистить весь кэш процедуры, выполните

DBCC FREEPROCCACHE

Вот примерперекомпиляция, если вы хотите поместить его в сценарий многократного использования:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object:  Maintenance - StoredProcedure [Sample].[SampleSearch]    Script Date: 07/28/2011 14:15:15 ******/
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'Sample' AND ROUTINE_NAME = 'Sampleearch'))
BEGIN
    PRINT 'Marking procedure [Sample].[SampleSearch] for recompile'
    EXEC sp_recompile 'Sample.SampleSearch'
    PRINT 'Finished marking procedure [Sample].[SampleSearch] for recompile'
END

GO

Однако, если запрос возвращает разные результаты, возможно, включите трассировку SQL или отладьте вызов из кода, чтобы обеспечить то же самое ви оба параметра используются в обоих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...