我有一個 sql 代理作業,它運行一個作業步驟以將 xml 檔案匯入表中。這作業正常。我想要一個正在運行的日志檔案來記錄沿途的資訊和錯誤。目前,第一次插入我的 Logs 表有效。如果我的 OPENROWSET 命令失敗,即 1Events.xml 不可用,則 sql 代理作業回傳失敗,這很好。但是,如何在退出之前在 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
uj5u.com熱心網友回復:
正如 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如果--Throw; --?在CATCH.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481354.html
標籤:sql sql服务器 tsql sql-agent-job
上一篇:兩位數字范圍正則運算式
