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

尝试。。。抓住。。。插入到

东门玺
2023-03-14

我试图将我从选择语句中得到的所有错误插入到错误表中,但我无法做到这一点。

BEGIN TRY 
    INSERT INTO [database]..[Table]([Column1], [Column2], [Column3])
       SELECT 
           [Column1], [Column2], [Column3] 
       FROM 
           [database]..[SourceTable] 
END TRY
BEGIN CATCH
     INSERT INTO [database]..[ErrorTable]([Column1], [Column2], [Column3])
        -- What to do here? .... (select the same query as up?)
        SELECT 
            [Column1], [Column2], [Column3] 
        FROM [database]..[SourceTable]
END CATCH

现在我想看到我的Error表中的所有错误以及表中正确的所有一次,但我没有得到这个工作?

源系统的数据类型是nvarchar,我的列是INT,因为值应该只有INT…所以这是源系统的糟糕设计?

共有3个答案

魏学智
2023-03-14

如果插入中的任何行失败,将在该批处理中插入的所有行也将失败。

--在这里做什么?……(选择与up相同的查询?)

所以…是的…同样的查询,因为所有的行都被重定向了,即使只有一个失败了。

你有什么理由认为他们会失败?主键?外键?还有其他约束或触发因素吗?如果是这种情况,您可以对数据集进行预检查,查找那些丢失的键,并将这些行保存到错误表中,然后插入其余的行,您甚至不需要try catch。

编辑:

在那些nvarchar且应为INT的列中,您可以过滤patindex(“%[^0-9]]”的行,

陈知
2023-03-14

我建议您努力解决问题,而不是尝试捕获错误。因此,查找不匹配的值,如下所示:

SELECT [Column1], [Column2], [Column3] 
FROM [database]..[SourceTable] 
WHERE Column1 LIKE '%[^0-9'%] OR
      Column2 LIKE '%[^0-9'%] OR
      Column3 LIKE '%[^0-9'%];

如果您使用的是SQLServer 2012,请使用try_convert()

SELECT [Column1], [Column2], [Column3] 
FROM [database]..[SourceTable] 
WHERE try_convert(int, Column1) is null OR 
      try_convert(Column2) is null OR
      try_convert(Column3) is null;

您可以使用类似的语句来插入正确的数据。

韶镜
2023-03-14

试试这个

Begin Catch 

INSERT INTO [database]..[ErrorTable]
(
[Column1],
[Column2],
[Column3],
[Column4],
[Column5],
[Column5]
)
SELECT
    cast (ERROR_NUMBER() as <your datatype>)
    ,cast (ERROR_SEVERITY() as <your datatype>)
    ,cast (ERROR_STATE() as <your datatype>)
    ,cast (ERROR_PROCEDURE() as <your datatype>)
    ,cast (ERROR_LINE() as <your datatype>)
    ,cast (ERROR_MESSAGE() as <your datatype>)
End Catch
 类似资料:
  • 我试图在JAVA中的while循环中使用try-catch语句,只是为了在向nextInt提供字符串输入时捕获异常,我不知道为什么它在第一次错误输入后继续引发异常。 密码 当给出正确的输入时。 但当输入错误时,这种情况会持续无限次。 会有很大的帮助,即使有人回答。 谢谢你。

  • 我正在开发一个永远运行的Java程序,但我不知道如何在不使用“try-catch”的情况下将每个循环延迟一秒钟。我试过了 但它似乎不起作用。有人能帮我吗?

  • 我对投球的尝试/接球感到困惑。函数中有两个可能的IOExceptions。一,我想抓住并继续。另一个我想抛出一个异常让前面的函数处理。 如果IOException无法打开文件,我想捕获它,通知用户,然后继续。如果清除目录时出现IOException,我想抛出一个异常并在调用代码中处理它。

  • 本文向大家介绍JavaScript 避免尝试/抓住对性能至关重要的功能,包括了JavaScript 避免尝试/抓住对性能至关重要的功能的使用技巧和注意事项,需要的朋友参考一下 示例 某些JavaScript引擎(例如,Node.jsIgnition + turbofan之前的Chrome的当前版本和较旧版本)无法在包含try / catch块的函数上运行优化器。 如果您需要处理关键性能代码中的异常

  • 问题内容: 遵循Android标签的任何人都可能对我很熟悉。我很难为我的高分实现SQLite数据库。这也是我第一次使用SQLite。 我正在尝试仅插入两个变量-int和long。我的方法无法正常工作。除了上面讨论的内容外,任何其他建议也应受到赞赏。 预先感谢您的帮助。 Highscores.java DatabaseHelper.java LogCat输出 问题答案: 在这行上,打开数据库: 这会

  • 为了快速地将数据插入到数据库中,我一直在尝试生成一个巨大的SQL(大约200个查询),但由于某种原因,我得到了SQL错误,但不确定是什么导致了它。 错误: SQL错误(1064):您的SQL语法有错误;查看与您的MySQL server版本相对应的手册,以了解在第8行附近使用的正确语法 下面是我的一部分代码: 你可以在Pastebin上找到我的完整SQL。 不知道是什么原因造成的,因为后面的“6”