如何从SQL异常信息中提取唯一约束字段?附示例
如何从SQL唯一键约束异常中提取重复键值
当然有办法啦!这类SQL Server抛出的唯一键异常消息格式非常固定,我们可以用正则表达式精准提取出你需要的重复键值内容。
先看看异常消息的规律
你的两个示例异常都遵循同一个模式:
违反唯一键约束'UQ__T_Client_NameSector'。无法在对象'dbo.T_Clients'中插入重复键。重复键值为(Geto)。语句已终止。
违反唯一键约束'UQ__T_Client_NameSector'。无法在对象'dbo.T_Clients'中插入重复键。重复键值为(Rest, 1)。语句已终止。
不难发现,我们要的内容总是被包裹在重复键值为(和)之间,刚好可以用正则的捕获组来抓取这部分内容。
具体实现方案
我给你两种常用语言的实现示例,你可以根据自己的开发场景选择:
C# 示例
using System; using System.Text.RegularExpressions; public class SqlDuplicateKeyExtractor { public static string GetDuplicateKeyFromException(string exceptionMsg) { // 正则匹配"重复键值为(xxx)"中的xxx部分 var regexPattern = @"重复键值为\((.*?)\)"; var matchResult = Regex.Match(exceptionMsg, regexPattern); return matchResult.Success ? matchResult.Groups[1].Value : null; } public static void Main() { // 测试示例1 var msg1 = "违反唯一键约束'UQ__T_Client_NameSector'。无法在对象'dbo.T_Clients'中插入重复键。重复键值为(Geto)。语句已终止。"; Console.WriteLine(GetDuplicateKeyFromException(msg1)); // 输出: Geto // 测试示例2 var msg2 = "违反唯一键约束'UQ__T_Client_NameSector'。无法在对象'dbo.T_Clients'中插入重复键。重复键值为(Rest, 1)。语句已终止。"; Console.WriteLine(GetDuplicateKeyFromException(msg2)); // 输出: Rest, 1 } }
Python 示例
import re def extract_duplicate_key(exception_msg): # 定义匹配模式 pattern = r"重复键值为\((.*?)\)" match = re.search(pattern, exception_msg) # 返回捕获到的内容,没有匹配到就返回None return match.group(1) if match else None # 测试示例1 msg1 = "违反唯一键约束'UQ__T_Client_NameSector'。无法在对象'dbo.T_Clients'中插入重复键。重复键值为(Geto)。语句已终止。" print(extract_duplicate_key(msg1)) # 输出: Geto # 测试示例2 msg2 = "违反唯一键约束'UQ__T_Client_NameSector'。无法在对象'dbo.T_Clients'中插入重复键。重复键值为(Rest, 1)。语句已终止。" print(extract_duplicate_key(msg2)) # 输出: Rest, 1
注意事项
这个方案是针对SQL Server的默认异常格式设计的,如果你的数据库是MySQL、PostgreSQL等其他类型,异常消息的格式会不一样,到时候只需要调整正则表达式的匹配模式即可。
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

