У меня есть следующая хранимая процедура, которая в основном использует курсор, чтобы получать людей, у которых есть встречи сегодня, и отправляет их по электронной почте. По какой-то причине этот запрос не будет завершен. Когда я пытаюсь выполнить его, он просто вращается, и я должен остановить его. Я разрешил ему работать до 7 минут один раз, и все же я не получил ни ошибки, ни таймаута. Не уверен, что он делает. Любая помощь будет оценена. Вот мой запрос:SQL Server Хранимая процедура с курсором
ALTER PROCEDURE [dbo].[spReminderEmail]
AS
SET NOCOUNT ON;
DECLARE @MyCursor CURSOR
DECLARE @emailBody nvarchar(max)
DECLARE @subject nvarchar(max)
DECLARE @recipients nvarchar(max)
DECLARE @appointmentDate datetime
DECLARE @doctorFirstName nvarchar(max)
DECLARE @doctorLastName nvarchar(max)
DECLARE @groupName nvarchar(max)
DECLARE @location nvarchar(max)
DECLARE @count int
SET @count = 0
SET @MyCursor = CURSOR FAST_FORWARD For
Select StartTime, PersonEmail, DoctorFirstName, DoctorLastName, GroupName, Location from vwAppointment where StartTime BETWEEN CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) AND IsActive = 1
Open @MyCursor
FETCH NEXT FROM @MyCursor INTO @appointmentDate, @recipients, @doctorFirstName, @doctorLastName, @groupName, @location
WHILE @@FETCH_STATUS = 0
BEGIN
SET @emailBody = 'Hello from ' + @groupName + '. This is an email reminder of your appointment with ' + @doctorFirstName + ' ' + @doctorLastName + ' on ' + convert(varchar, @appointmentDate, 1) + ' at ' + @location + '.' + CHAR(13) + CHAR(10) + 'To help facilitate the meeting, please remember to bring with you any relevant documents (ID, insurance, etc.) and be prepared with questions for the office.' + CHAR(13) + CHAR(10) + 'If you are unable to make the appointment, please call ' + @groupName + ' or return to KSUAdvising and use the cancellation function. Cancellations are requested at least a day in advance.' + CHAR(13) + CHAR(10) + 'Late Policy:' + CHAR(13) + CHAR(10) + 'some text here...';
SET @subject = 'REMINDER: Your Appointment with the ' + @groupName;
SET @count = @count + 1
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
PRINT @count
if (@count > 0)
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name='my_profile',
@[email protected],
@[email protected],
@[email protected]
END
Вы пытались выполнить запрос за пределами хранимой процедуры? – Necreaux
Вам понадобится FETCH NEXT внутри вашего цикла WHILE. –
Если он работает нормально и внезапно перестает работать, это, скорее всего, проблема статистики, или sproc требует перекомпилировать. – UnhandledExcepSean