2015-04-24 4 views
1

У меня есть следующая хранимая процедура, которая в основном использует курсор, чтобы получать людей, у которых есть встречи сегодня, и отправляет их по электронной почте. По какой-то причине этот запрос не будет завершен. Когда я пытаюсь выполнить его, он просто вращается, и я должен остановить его. Я разрешил ему работать до 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 
+2

Вы пытались выполнить запрос за пределами хранимой процедуры? – Necreaux

+4

Вам понадобится FETCH NEXT внутри вашего цикла WHILE. –

+0

Если он работает нормально и внезапно перестает работать, это, скорее всего, проблема статистики, или sproc требует перекомпилировать. – UnhandledExcepSean

ответ

3

Внутри цикла WHILE (до конца строки) необходимо добавить следующее:

FETCH NEXT FROM @MyCursor INTO @appointmentDate, @recipients, 
    @doctorFirstName, @doctorLastName, @groupName, @location 

для прокрутки для каждого цикла записи вашего запроса

1

Вы никогда не получая следующую строку. Таким образом, ваша петля будет продолжаться вечно, ничего не делая. Вам нужно добавить FETCH NEXT FROM @MyCursor INTO @appointmentDate, @recipients, @doctorFirstName, @doctorLastName, @groupName, @location прямо перед вашим статусом END. См. Пример внизу This

1

Вы также можете попробовать debug ваш sp, чтобы найти точное место проблем в вас SP в будущем.

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