【发布时间】:2019-11-13 17:58:00
【问题描述】:
我有一个带有 INSERT 语句的代码块,其中应用了许多逻辑,几分钟后它由于任何其他插入错误(如“截断错误”等)而失败。因此插入失败并引发错误,正如我在 catch 块中提到的那样,但我需要知道哪个特定 ID 导致了该错误。有可能得到那个ID吗? 下面是我的示例代码块
BEGIN TRY
BEGIN TRAN
INSERT INTO MyTable (fieldA, fieldB,.....)
SELECT (fieldA, fieldB,.....)
FROM <many joins from other tables>
COMMIT TRAN
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE()
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
如果插入失败,我们可以在 CATCH 块中获取 fieldA 值以及 ERROR_NUMBER()、ERROR_MESSAGE() 吗?
或者有没有其他方法可以查看导致错误的特定 fieldA 值? 任何建议将不胜感激。
【问题讨论】:
-
在插入过程中,您的某些数据似乎被截断了。向我们展示一些示例数据以及可能的真实查询对您有所帮助,以便我们更好地了解这里发生的情况。
-
你可以在你的insert语句之前使用相同的select语句并将fieldA赋值给一个变量,然后你可以在catch块中选择变量的值
-
@ShikharArora 这是不可能的,因为他没有遍历数据,他正在从其他表中获取数据并将其作为批量插入新表中。
-
SQL Server 没有提供任何方法来做这个,需要提前清理源表中的数据-检测无效值。
-
@Mar1009 首先,您需要找到长度大于目标列的列。然后您可以对其进行查询以找到具有较大文本的列。
select * from table where len(col1) > 20。这样您就可以找到包含无效文本的行。
标签: sql-server tsql sql-server-2008-r2 try-catch