当前位置: 首页 > 知识库问答 >
问题:

未在存储过程的 try-catch 块中捕获大容量加载数据转换错误

濮阳征
2023-03-14

我面临着从CSV到MSSQL表的批量插入的问题。使用try, catch块我看不到任何错误,但当我在没有try catch块的情况下执行时,它会给出以下3个错误。

Msg 4864,级别16,状态1,第1行第2行第10列(InActiveDate)的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

消息 7399,级别 16,状态 1,第 1 行 链接服务器“(空)”的 OLE DB 提供程序“BULK”报告了错误。提供程序未提供有关该错误的任何信息。

Msg 7330,第16级,状态2,第1行无法从链接服务器(null)的OLE DB提供程序“批量”中提取行。

当我设置<code>MAXERRORS=0

Msg 7330,第16级,状态2,第1行无法从链接服务器(null)的OLE DB提供程序“批量”中提取行。

我创建了一个过程来捕获错误并插入到日志表中。有没有办法捕获所有3个错误或第1个错误(这对开发人员来说更明智)?

ALTER PROCEDURE [dbo].[spr_BulkInsert] @FileToProcess varchar(200)
AS
        BEGIN TRY
        SELECT * INTO #Bulktest FROM test WHERE testID = 0;
        EXEC('BULK INSERT #Bulktest FROM '''+@FileToProcess+'''WITH (MAXERRORS = 0,FIELDTERMINATOR= ''|'',ROWTERMINATOR = ''\n'',FIRSTROW=2);')
        END TRY
        BEGIN CATCH
           DECLARE @Message nvarchar(4000),@Severity int,@Number int;
           SELECT @Severity = ERROR_SEVERITY(),@Message = CONVERT(nvarchar(10),ERROR_NUMBER())+ N': '+ ERROR_MESSAGE();
           RAISERROR (@Message,@Severity, 1);
        END CATCH 
    END
    Calling procedure is 
        BEGIN TRY
        EXEC [dbo].[spr_BulkInsert] @FileToProcess = @FileName
        END TRY
        BEGIN CATCH
        EXEC [dbo].[spr_ErrorHandling] 
        END CATCH

    Thanks

共有1个答案

穆高澹
2023-03-14

这是一个错误。有关详细信息,请参阅连接项。

错误的描述.

我试图将数据从平面文件批量插入到特定列的数据类型不匹配的数据库表中。

在上述情况下,我收到了以下错误消息,但没有TRY/CATCH块:

消息 4864,级别 16,状态 1,第 1 行大容量加载数据转换错误(类型不匹配或指定代码页的字符无效),为行 2,列 15(列名)。

Msg 4863,级别16,状态1,第1行,第3行,第13列(列名)的大容量加载数据转换错误(截断)。

尽管严重性级别为16,但我看不到TRY/CATCH构造捕获的错误。

请参阅此问题和答案以了解一些解决方法

 类似资料:
  • 我需要在我的存储过程中添加错误处理。我相信当只有一个insert语句时,通常不需要使用BEGIN TRAN/COMMIT TRAN。还有使用SET XACT_ABORT,NOCOUNT ON语句的意义是什么。请给出最佳/标准的方法将错误处理添加到下面的SP中。如果出现错误,我还需要在catch段中调用dbo.usp_get_error_info。请建议。

  • 我开始在javascript对象中添加错误处理,这些对象通常使用jQuery。我的问题是,当我从jQuery方法中抛出新错误时-它不会被包装jQuery调用的catch语句捕获-它只是抛出标准错误,但不会作为日志消息登录到控制台。下面是一个例子: 当我用try/catch包装回调函数的内容时,它就可以工作了: 有什么想法可以简化它,为什么会这样?

  • 我创建了一个更新数据库结构的存储过程。在try/catch块中,如果发生错误,我可以获取ERROR_MESSAGE()值,但它没有指定错误发生的位置或对象。ERROR_NUMBER() 函数是无用的,因为行号偏离 ab 很多。 是否有任何方法来识别正在创建的对象或它失败的语句?下面是一个try catch块的小示例: 错误消息是:<code>无法创建约束。请参阅以前的错误 我想知道哪个约束失败了。

  • 这是我的脚本,它返回一个布尔值 我希望脚本打印捕获的异常,并返回布尔值,但在本例中,脚本失败时只返回false。感谢您的帮助,我需要打印异常,就像try-catch块不存在一样。

  • 问题内容: 我制作了一个无法实时运行的React应用程序,使用它的人注意到,偶尔会出现一些奇怪的错误。我不知道为什么或发生什么,也无法复制它。 所以我想知道是否有一种方法可以将整个应用程序或其部分包装在try / catch块中,以便将错误发送到服务器上的错误日志中? 到目前为止,我所读到的只是可以将整个render函数包装在try / catch中,但是由于用户交互的原因而不会捕获任何错误吗?

  • 我做了一个不实时运行的反应应用程序,使用它的人注意到偶尔会出现一些奇怪的错误。我不知道为什么或发生了什么,也无法重现它。 所以我想知道是否有一种方法可以将整个应用程序或其部分包装在try/catch块中,以便我可以将错误发送到服务器上的错误日志? 到目前为止,我所读到的只是,您可以将整个渲染函数包装在尝试/捕获中,但这不会由于用户交互而捕获任何错误,对吗?