你能在存储过程中使用Try Catch来“做”某事吗?

时间:2012-07-02 21:08:53

标签: sql-server-2008-r2

我已关联需要更新的服务器。

BEGIN TRY

delete [SDNY-PAND\BarCode].Barcodes.dbo.barcodes
where Plant_Location <> 'Jefferson,  GA123'

-- bla bla bla


END TRY
BEGIN CATCH

--print ' in error now'


set @strBody = 'It appears that the server that holds the barcode data
        is currently unavailable.  Please validate that it is plugged in
        and turned on for IS' 
set @MailTo = 'ThatGroup@work'  
set @ESubject = 'Message from Barcode Server Update Process' 
EXEC msdb.dbo.sp_send_dbmail
        @recipients =@MailTo,
        @body = @strBody,
        @body_format ='TEXT',
        @subject = @ESubject,
        @profile_name ='ColossusMain'

END CATCH

这个过程会有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

顺便说一句,您可以做得比检查链接服务器状态更好。有一个名为sp_testlinkedserver的内置程序。如果链接服务器无法访问,这将引发错误,阻止您尝试任何删除等,并将您发送到CATCH。如果由于删除而导致进一步的错误,比如说,也会调用CATCH,但ERROR_MESSAGE()会有所不同......

BEGIN TRY
  EXEC sp_testlinkedserver N'SDNY-PAND\BarCode';

  DELETE [SDNY-PAND\BarCode].Barcodes.dbo.barcodes
    WHERE Plant_Location <> 'Jefferson,  GA123';

  -- bla bla bla
END TRY
BEGIN CATCH
  SET @strBody = N'It appears...'
    + CHAR(13) + CHAR(10) + ERROR_MESSAGE();
  -- ...
  EXEC msdb.dbo.sp_send_dbmail ...;
END CATCH

如果服务器无法访问,则错误消息将类似于:

  

链接服务器“SDNY-PAND \ BarCode”的OLE DB提供程序“SQLNCLI11”   返回消息“登录超时已过期”。
OLE DB提供程序   链接服务器“SDNY-PAND \ BarCode”的“SQLNCLI11”返回消息   “发生了与网络相关或特定于实例的错误   建立与SQL Server的连接。找不到服务器   无障碍。检查实例名称是否正确以及SQL Server是否正确   配置为允许远程连接。有关更多信息,请参阅SQL   Server Books Online。“。”SQL Server网络接口:错误   找到指定的服务器/实例[xFFFFFFFF]。