I am running a stored procedure which is running infinitely.
I have used a while loop that seems to be running without ever ending.
CREATE PROCEDURE ABC
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Id INT;
DECLARE @iter INT = 1;
DECLARE @iterMax INT;
DECLARE @psubject VARCHAR(100);
DECLARE @pbody NVARCHAR(MAX);
DECLARE @pSendTo NVARCHAR(MAX);
DECLARE @pProfile VARCHAR(MAX);
IF OBJECT_ID('tempdB..#temp') IS NOT NULL
DROP TABLE #temp;
SET @pProfile = 'Test';
IF ((SELECT COUNT(*)
FROM [Table_A] R
JOIN [Table_B] T ON R.Id = T.r_Id
WHERE R.[Date] <= (DATEADD(DAY, -1, GETDATE()))
AND T.[Sent_Flag] IS NULL) >= 1)
BEGIN
SELECT IDENTITY(int, 1, 1) AS RecId,
[r_id] * 1 AS Id
INTO #temp
FROM [Table_A] R
JOIN [Table_B] T ON R.Id = T.r_Id
WHERE R.[Date] <= (DATEADD(DAY, -1, GETDATE()))
AND T.[Sent_Flag] IS NULL;
BEGIN
SET @iterMax = (SELECT COUNT(*)FROM #temp);
WHILE (@iter <= @iterMax)
BEGIN
SET @psubject = 'HIIII'; /*this is in HTML example */
SET @pbody = 'You got one email';
IF ((SELECT COUNT(*)
FROM [Table_B]
WHERE R_Id = (SELECT Id FROM #temp WHERE RecId = @iter)
AND [Mail1_Flag] = 'Y'
AND [Mail2_Flag] = 'Y') = 1)
BEGIN
IF ((SELECT COUNT(*)
FROM [Table_A] R
JOIN [Table_B] T ON R.Id = T.r_Id
WHERE R_Id = (SELECT Id FROM #temp WHERE RecId = @iter)
AND R.[Date] <= (DATEADD(DAY, -1, GETDATE()))
AND T.[Sent_Flag] IS NULL) = 1)
BEGIN
SET @pSendTo = N'[email protected]';
EXEC msdb.dbo.sp_send_dbmail @profile_name = @pProfile,
@body = @pbody,
@subject = @psubject,
@recipients = @pSendTo,
@body_format = 'HTML';
END;
UPDATE [Table_B]
SET [Sent_Flag] = 'Y'
WHERE [Id] IN (SELECT Id FROM #temp WHERE RecId = @iter);
END;
END;
SET @iter = @iter + 1;
END;
END;
IF OBJECT_ID('tempd..#temp') IS NOT NULL
DROP TABLE #temp;
END;
This program is checking that if date is more than 24 hours then it will send a mail correspondingly. I am able to trigger a mail. But I am getting multiple mails. Like the loop is running infinitely and getting same mail multiple times and the sent_Flag column is initial NULL and after a mail is sent it sholud update to 'Y' but it is also not updating to 'Y' after mail is triggered.
Please help to resolve this issue. Thank you
WHILEloop in the first place infers a design flaw. What are you trying to achieve with the SP? Also, I note that in yourWHILE (@iter <= @iterMax)section you never change the value of@iteror@iterMax, so thatWHILEwill never be exitted. (You can see this quite easily now too, as I formatted and aligned your code for you.)Sent_Flag?WHILE (@iter <= @iterMax)useWHILE EXISTS (SELECT 1 FROM #temp WHERE Sent_Flag IS NULL)