T-SQL 命令未进入 CATCH

T-SQL Command not entering CATCH

我有一个 sql 代理作业,它运行作业步骤以将 xml 文件导入 table。这工作正常。我想要一个 运行 日志文件来记录整个过程中的信息和错误。目前,第一个插入我的日志 table 有效。如果我的 OPENROWSET 命令失败,即 1Events.xml 不可用,则 sql 代理作业 returns 失败,这很好。但是,如何在退出之前将插入日志 table 发生在 CATCH 块中?

BEGIN TRY
    INSERT INTO Logs (Message, Level, TimeStamp)
    SELECT 'Attempting to insert contents of Events.xml into sql table (XML_Events)', 'INFO', GETDATE();
   
    INSERT INTO XML_Events(XMLData, LoadedDateTime)
    SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
    FROM OPENROWSET(BULK '\servername\c$\Events.xml', SINGLE_BLOB) AS x;
   
    INSERT INTO Logs (Message, Level, TimeStamp)
    SELECT 'Successfully inserted contents of Events.xml into sql table (XML_Events)', 'INFO', GETDATE();
END TRY
BEGIN CATCH
     INSERT INTO Logs (Message, Level, TimeStamp)
    SELECT 'Error inserting contents of Events.xml into sql table (XML_Events)', 'ERROR', GETDATE();
END CATCH

正如 Stu(刚才)提到的那样,这是不容易“发现”的错误之一。但是,您可以使用的一种方法是使用延迟语句并在 sys.sp_executesql 内执行它;这将导致您想要的行为:

BEGIN TRY
    INSERT INTO dbo.Logs (Message, Level, TimeStamp)
    SELECT 'Attempting to insert contents of Events.xml into sql table (XML_Events)', 'INFO', GETDATE();
    
    DECLARE @SQL nvarchar(MAX),
            @CRLF nchar(2) = NCHAR(13) + NCHAR(10);
    SET @SQL = N'INSERT INTO dbo.XML_Events(XMLData, LoadedDateTime)' + @CRLF +
               N'SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()' + @CRLF +
               N'FROM OPENROWSET(BULK ''\servername\c$\Events.xml'', SINGLE_BLOB) AS x;';

    EXEC sys.sp_executesql @SQL;
   
    INSERT INTO dbo.Logs (Message, Level, TimeStamp)
    SELECT 'Successfully inserted contents of Events.xml into sql table (XML_Events)', 'INFO', GETDATE();
END TRY
BEGIN CATCH
     INSERT INTO dbo.Logs (Message, Level, TimeStamp)
     SELECT 'Error inserting contents of Events.xml into sql table (XML_Events)', 'ERROR', GETDATE();
     --Throw; --?
END CATCH

请注意,如果 CATCH 中没有出现某种错误,SQL 代理将不知道批处理失败,因此 CATCH 中的 --Throw; --? ].