sql - 如何从错误消息sql server中查找表名和列名
问题描述
我们正在转换triggers
我们的application tables
with 以foreign keys
进行性能优化。有triggers
自定义错误消息以防referential integrity violation
. 将触发器更改为外键后,我们使用错误处理来捕获错误消息。例如在 a 之后抛出的错误消息foreign key violation
INSERT 语句与 FOREIGN KEY 约束“fk_test”冲突。冲突发生在数据库“db”、表“dbo.test”、列“代码”中。
我们需要从这个错误消息中动态提取table name
andcolumn name
以将它们放入custom error message
. 有什么方法可以从错误消息中获取table name
and 。column name
我们可以使用一些字符串操作,charindex
但我正在寻找其他选项
解决方案
试试看: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
推荐阅读
- jenkins-pipeline - 具有条件代理类型的 Jenkins 流水线矩阵
- javascript - 如何显示/隐藏
- 使用 JavaScript 基于其文本内容?
- flutter - (Flutter) 升级到 NullSafety
- r - R - 双 y 轴图表:对齐 0 并调整比例
- javascript - javascript transformToDocument XSLT 不是预期的输出
- java - 更新 Android 中多部分表单数据请求的默认 Content-Type
- c# - 从 dll 文件为 Excel 创建加载项安装程序
- reactjs - React props 测试用例未正确渲染
- regex - 从 HTTP 请求中提取用户代理
- node.js - 如何将插件应用于@middy/validator?