我的应用程序运行SQL脚本来加载数据,当它加载的文件出现问题时,它只记录最后一个错误,该错误不包含有关文件无法加载的有用信息。
示例代码:
BEGIN TRY
BULK INSERT MyTableName
FROM 'C:\MyFilename.txt'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '\n',
TABLOCK,
MAXERRORS=0,
ERRORFILE = 'C:\MyFilename_Errors.log'
)
;
END TRY
BEGIN CATCH
INSERT INTO MyErrorLog
SELECT ERROR_MESSAGE() as Issue
, ERROR_LINE() as IssueRowNum
;
END CATCH
此脚本将在[MyErrorLog]中为第三个错误创建一个条目(见下文)。日志文件会告诉我什么行,但不是什么字段:
行30539文件偏移1910820 ErrorFile偏移0 - HRESULT 0x80004005
如果我“删除”CATCH中的错误,这里有3行:
Msg 4864,Level 16,State 1,Line 3批量加载数据转换错误 (为指定的代码页键入不匹配或无效字符) 第1行第5列(MyField)。
Msg 7399,Level 16,State 1,Line 3 OLE DB提供程序“BULK”for 链接服务器“(null)”报告错误。提供者没有给出 有关错误的任何信息。
消息7330,级别16,状态2,行3无法从OLE DB中获取行 提供者“BULK”用于链接服务器“(null)”。
如何捕获第一条(和第二条)错误消息?
答案 0 :(得分:1)
您只能捕获T-SQL CATCH块中的单个错误。根据{{3}},解决方法是使用proto
(或不使用TRY / CATCH)并捕获客户端代码中的错误。
因此,您需要从客户端应用程序(包括SQLCLR)调用脚本,以便捕获并记录所有错误。