我一直在努力让这一点代码得到纠正。我希望有人可以提供帮助。我肯定错过了什么。
这是我想要完成的。在归档过程中,我们会经历从许多表中删除数千到数百万行的过程。有些删除进程的时间比其他进程要长。所以我想要做的是在运行期间捕获任何错误并通过电子邮件通知我。我也希望在删除完成后给我发电子邮件。
INTERVAL代码适用于删除,对我们的流程是必需的。我只是想正确添加一个Try..Catch Block来发送电子邮件。
以下是测试时今天的表现 当我运行Select 1/0而不是Delete来强制错误。我会收到“FAILED”电子邮件。但是我也会收到“已完成”的电子邮件。在这种情况下,我只会查找失败的电子邮件。此外,对于电子邮件和“打印”行,@ Totalcount变量未从此行填充 - SET @TOTALCOUNT = @TOTALCOUNT + @CHECKCOUNT
当我将下面的代码作为DELETE运行而没有失败时,我收到“已完成”的电子邮件。虽然@totalcount变量仍然存在填充电子邮件和打印行的问题。
我已将完成的SET变量和已完成的电子邮件代码移至TRY块并且没有太多运气。我已经尝试了很多Nesting Try块的变种并且移动了BREAK,但我只是看不到它是正确的。任何帮助和指导都将非常感谢 谢谢
DECLARE
@INTERVAL INT
,@CHECKCOUNT INT
,@TOTALCOUNT INT
,@starttime DATETIME
,@endDELtime DATETIME
,@endtime DATETIME
SET @starttime = GETDATE()
SET @INTERVAL = 10
SET @TOTALCOUNT = 0
WHILE 1 = 1
BEGIN
BEGIN TRY
--SELECT 1/0;
DELETE TOP (@INTERVAL)
FROM dbo.specphone
WHERE SPEC IN
(
SELECT
SPEC
FROM dbo.tblGeneral (NOLOCK)
)
END TRY
BEGIN CATCH
DECLARE @err_msg AS NVARCHAR(MAX);
SET @endDELtime = GETDATE()
SET @err_msg = 'Severity - ' + CONVERT(VARCHAR(10), ERROR_SEVERITY()) +
CHAR(13) +
'Error Number - ' + CONVERT(VARCHAR(10), ERROR_NUMBER()) + CHAR(13) +
'Error Message - ' + ERROR_MESSAGE() + CHAR(13) +
'tblspecphone: ' + 'Total Count ' + CONVERT(VARCHAR, @TOTALCOUNT) +
CHAR(13) +
' Start Time is ' + CONVERT(VARCHAR(25), @starttime) + CHAR(13) +
' End Time is ' + CONVERT(VARCHAR(25), @endDELtime) ;
--SELECT ERROR_NUMBER() AS ErrorNumber;
--SELECT ERROR_MESSAGE() AS ErrorMessage;
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'default',
@recipients = 'gdh@isp.com',
@subject = 'FAILED - Archive Project Delete Script',
@body = @err_msg;
END CATCH
SET @CHECKCOUNT = @@RowCount
SET @TOTALCOUNT = @TOTALCOUNT + @CHECKCOUNT
IF @CHECKCOUNT = 0
SET @endtime = GETDATE()
DECLARE
@bodymsg AS VARCHAR(MAX)
SET @bodymsg = 'The Delete Query has finished. Verify and Proceed on
with next script if no Errors.' + CHAR(13) +
'tblspecphone: ' + 'Total Count ' + CONVERT(VARCHAR, @TOTALCOUNT) +
CHAR(13) +
' Start Time is ' + CONVERT(VARCHAR(25), @starttime) + CHAR(13)
+
' End Time is ' + CONVERT(VARCHAR(25), @endtime)
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'default',
@recipients = 'gdh@isp.com',
@body = @bodymsg,
@subject = 'Completed - Archive Project Delete Script';
END
BREAK
END
PRINT '
tblspecphone: ' + 'Total Count ' + CONVERT(VARCHAR, @TOTALCOUNT) +
' Start Time is ' + CONVERT(VARCHAR(25), @starttime) + ' End Time is '
+ CONVERT(VARCHAR(25), @endtime)
答案 0 :(得分:1)
放置一个布尔变量,在catch中将其设置为false,然后使用它来确定是否发送COMPLETE电子邮件。
答案 1 :(得分:0)
我认为你的错误是"休息&#34 ;;它应该在while循环中,而不是在catch-block中,并且应该根据omoret提到的变量进行检查
示例:
DECLARE @error int
SET @error = 0
DECLARE @i int
SET @i = 5
WHILE @i > -2
BEGIN
BEGIN TRY
SELECT 1 / @i
PRINT 'it is ok to divide by ' + cast(@i as varchar)
END TRY
BEGIN CATCH
PRINT 'ERROR'
SET @error = 1
END CATCH
IF @error = 1
BREAK;
SET @i = @i - 1
END