Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 带游标的SQL Server存储过程_Sql Server_Stored Procedures_Scheduled Tasks - Fatal编程技术网

Sql server 带游标的SQL Server存储过程

Sql server 带游标的SQL Server存储过程,sql-server,stored-procedures,scheduled-tasks,Sql Server,Stored Procedures,Scheduled Tasks,我有以下存储过程,它基本上使用游标来获取今天有约会的人并向他们发送电子邮件。由于某些原因,此查询无法完成。当我试图执行它时,它只是旋转,我不得不停止它。我让它运行了7分钟,但仍然没有出现错误或超时。不知道它在做什么。任何帮助都将不胜感激。我的问题是: ALTER PROCEDURE [dbo].[spReminderEmail] AS SET NOCOUNT ON; DECLARE @MyCursor CURSOR DECLARE @emailBody nvarchar(max) DECLAR

我有以下存储过程,它基本上使用游标来获取今天有约会的人并向他们发送电子邮件。由于某些原因,此查询无法完成。当我试图执行它时,它只是旋转,我不得不停止它。我让它运行了7分钟,但仍然没有出现错误或超时。不知道它在做什么。任何帮助都将不胜感激。我的问题是:

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',
    @recipients=@recipients,
    @body=@emailBody, 
    @subject=@subject
END
在WHILE循环内(在结束行之前),必须添加以下内容:

FETCH NEXT FROM @MyCursor INTO @appointmentDate, @recipients,
  @doctorFirstName, @doctorLastName, @groupName, @location
要在WHILE循环内(在结束行之前)为每个循环滚动查询记录,必须添加以下内容:

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

要为每个循环滚动查询记录,您永远不会获取下一行。所以你的循环将永远不做任何事情。您需要将@MyCursor中的
FETCH NEXT添加到@appointmentDate、@recipients、@doctorFirstName、@doctorLastName、@groupName、@location
的末尾。请参见

底部的示例,您永远不会获取下一行。所以你的循环将永远不做任何事情。您需要将@MyCursor中的
FETCH NEXT添加到@appointmentDate、@recipients、@doctorFirstName、@doctorLastName、@groupName、@location
的末尾。请参阅

底部的示例。您还可以尝试在sp中查找问题的确切位置。

您也可以尝试在sp中查找问题的确切位置。

您是否尝试在存储过程之外运行查询?您需要在WHILE循环中执行下一次获取。如果它工作正常如果突然停止工作,则可能是统计信息问题,或者存储过程需要重新编译。您是否尝试在存储过程之外运行查询?您需要在WHILE循环中进行下一次提取。如果工作正常,并且突然停止工作,则可能是统计信息问题,或者存储过程需要重新编译。