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; --?
].
我有一个 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; --?
].