感谢您的回复。
'%[^0-9]%' 的提议让我大开眼界,因为我以前不知道 ^ 运算符。
我做了两个版本的所需约束。一种使用“仅”AND、OR、子字符串和非数字。没有花哨的索引或排除。太长了。
另一个版本由 AND、OR、子字符串和 insmuric 组成,但包含了建议的 ^ 操作。看起来好多了。
然后,最后,我采用了第三种解决方案 :-)
在数据库中添加了一个布尔列 RequiresCreditorValidation,并在我的 C# 代码中实现了一个正则表达式。
对于希望从结果检查中受益的其他人,他们在这里。
从“丑”开始:
CHECK ((val NOT IN ('+','-') AND (ISNUMERIC(val) = 1) OR
(ISNUMERIC(SUBSTRING(val, 1, DATALENGTH(val) -1))) = 1) AND
((SUBSTRING(val, (DATALENGTH(val)),1) LIKE '[0-9]') OR
(SUBSTRING(val, DATALENGTH(val),1) = '-')) AND
(SUBSTRING(val, 1, 1) NOT IN ('+','-')) )
第二个:
CHECK ( (SUBSTRING(val, 1, DATALENGTH(val) - 1) NOT LIKE '%[^0-9]%') AND
(SUBSTRING(val, DATALENGTH(val),1) LIKE '%[0-9-]') AND (DATALENGTH(val) > 0)
AND SUBSTRING(val, 1,1) NOT IN ('+','-') )
然后是正则表达式:
var allButLast = kreditorId.Substring(0, kreditorId.Length - 1);
if (Regex.Match(allButLast, "[^0-9]").Success)
return false;
if (!kreditorId.EndsWith("-"))
if (Regex.Match(kreditorId, "[^0-9]").Success)
return false;
return true;
感谢大家的优质、合格和快速的回复。