首页 > 解决方案 > 如何从错误消息sql server中查找表名和列名

问题描述

我们正在转换triggers 我们的application tableswith 以foreign keys进行性能优化。有triggers自定义错误消息以防referential integrity violation. 将触发器更改为外键后,我们使用错误处理来捕获错误消息。例如在 a 之后抛出的错误消息foreign key violation

INSERT 语句与 FOREIGN KEY 约束“fk_test”冲突。冲突发生在数据库“db”、表“dbo.test”、列“代码”中。

我们需要从这个错误消息中动态提取table nameandcolumn name以将它们放入custom error message. 有什么方法可以从错误消息中获取table nameand 。column name我们可以使用一些字符串操作,charindex但我正在寻找其他选项

标签: sqlsql-servertsql

解决方案


试试看:CHARINDEX您可以使用如下表的条件检索表和列名sys

虽然它是一个动态解决方案,但CHARINDEX这里没有硬编码,所以我希望它对你有用。

DECLARE @document VARCHAR(5000)
SET @document = '
        The INSERT statement conflicted with the FOREIGN KEY constraint "fk_test". 
        The conflict occurred in database "db", table "dbo.test", column ''Code''.'

SELECT t.name AS table_name, 
    c.name AS column_name
FROM sys.tables t
INNER JOIN sys.columns c ON c.object_id = t.object_id
WHERE CHARINDEX(t.[name], @document) > 0  
    AND CHARINDEX(c.[name], @document) > 0

dbo通过添加如下前缀使搜索更加健壮:

CHARINDEX(CONCAT('dbo.',t.[name]), @document) > 0 --For SQLSERVER2012 or +
CHARINDEX('dbo.'+ t.[name], @document) > 0 --For All Version

推荐阅读