You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server为UDDT定义规则时能否使用LIKE?具体如何实现

SQL Server UDDT规则使用LIKE语法的实现方案

结论先行

可以在UDDT绑定的规则中使用LIKE语法,你现有写法失效的核心原因是误用了=运算符做正则匹配,SQL Server原生等值判断不支持正则语法,需要调整规则写法。

问题根因

你编写的规则CREATE RULE RU_NAME AS @value = '^[A-Z][a-z]*';存在两处问题:

  • =是等值匹配运算符,无法识别你写的正则语法,^、*等正则标记在等值判断中会被当做普通字符处理
  • 若你需要规则对所有使用该UDDT的列生效,无需设置@futureonly = 'futureonly'参数,该参数仅会让规则对绑定后新建的列生效

正确实现代码

步骤1:清理原有测试对象(可选)

IF OBJECT_ID('dbo.OLT35A006T') IS NOT NULL DROP TABLE dbo.OLT35A006T;
IF EXISTS(SELECT * FROM sys.types WHERE name = 'DT_NAME') DROP TYPE dbo.DT_NAME;
IF EXISTS(SELECT * FROM sys.rules WHERE name = 'RU_NAME') DROP RULE dbo.RU_NAME;
GO

步骤2:创建带LIKE判断的规则

你需要实现的「首字母大写,后续为小写字母」的校验规则,LIKE写法如下:

CREATE RULE RU_NAME AS 
-- 首字母大写,后续为小写字母,无其他特殊字符
@value LIKE '[A-Z][a-z]%' 
AND @value NOT LIKE '%[^a-zA-Z]%';
GO

步骤3:创建UDDT并绑定规则

CREATE TYPE DT_NAME FROM VARCHAR(64) NOT NULL;
GO

EXEC sys.sp_bindrule @rulename = N'[dbo].[RU_NAME]', 
                     @objname = N'[dbo].[DT_NAME]';
GO

步骤4:创建测试表验证

CREATE TABLE [dbo].[OLT35A006T]
(
     [PFD_NAME] [dbo].[DT_NAME]
) ON [PRIMARY];
GO

-- 合法值插入成功
INSERT INTO OLT35A006T(PFD_NAME) VALUES ('Test');
-- 非法值(首字母小写)触发规则报错
INSERT INTO OLT35A006T(PFD_NAME) VALUES ('test');
-- 非法值(带数字)触发规则报错
INSERT INTO OLT35A006T(PFD_NAME) VALUES ('Test123');

补充说明

  • 规则属于SQL Server的过时功能,官方已明确后续版本会移除该特性,生产环境建议优先使用CHECK约束实现同类校验
  • 如果你需要更复杂的匹配逻辑,也可以用PATINDEX函数替代LIKE,示例:PATINDEX('[A-Z][a-z]%', @value) > 0

内容的提问来源于stack exchange,提问作者Jaimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:54:03