【发布时间】:2011-06-19 05:53:36
【问题描述】:
如何编写这个检查约束:
[AB]+,varchar 列,包含由 A 或 B 组成的非空字符串。
一些限制确实有效,但这个简单的无效。
排序有问题,还是什么?
【问题讨论】:
标签: c# .net sql regex sql-server-2008
如何编写这个检查约束:
[AB]+,varchar 列,包含由 A 或 B 组成的非空字符串。
一些限制确实有效,但这个简单的无效。
排序有问题,还是什么?
【问题讨论】:
标签: c# .net sql regex sql-server-2008
SQL 服务器本身不支持正则表达式。
但是,可以添加检查约束以匹配您提供的模式
not like '%[^AB]%'
测试:
declare @Test table(TestColumn varchar(100) check (TestColumn not like '%[^AB]%' and TestColumn != ''))
insert @Test
values ('AABAB') -- passed
insert @Test
values ('AAB') -- passed
insert @Test
values ('AABC') -- failed
insert @Test
values ('') -- failed
LIKE 模式非常有限。如果您需要真正的正则表达式约束,您可以实现非常简单的 CLR 函数。互联网上有很多例子。例如:Regular Expressions Make Pattern Matching And Data Extraction Easier。
【讨论】:
如果您想在 MSSQL 约束中使用完整功能的正则表达式 - 您需要编写自定义 dll 并将其附加到 sql 服务器。那么你就可以将它注册为一个本地函数,并以你喜欢的任何方式使用正则表达式。
见http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx。
如果您对此有困难 - 我可以发布一个用于 MSSQL 的 clr 库的简单示例
【讨论】:
如果使用上面其他人给出的 Check 约束(即 [AB][AB] 等),不能灵活地正确测试 varchar 值,那么您可以尝试使用触发器。
触发器可以让您更彻底地测试您的目标。
参考Example C on this link,而它使用触发器来测试跨表的业务规则,只需更改它以适应您需要做的任何测试:)
希望对你有帮助
示例代码可帮助您更改测试以满足您的需求
CREATE TABLE [dbo].[TestTrigger](
[stringtest] [varchar](100) NULL
) ON [PRIMARY]
GO
CREATE TRIGGER [dbo].[TestTrigger_TestAB]
ON [dbo].[TestTrigger]
FOR INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @testString varchar(100)
Declare @Len as int;
Declare @SearchPattern as varchar(8000);
Declare @Result as Int;
SELECT @testString = stringtest FROM inserted
Select @Len = Len(@testString);
While @Len>0
Begin
Select @SearchPattern = Isnull(@SearchPattern,'') + '[A-B]';
Select @Len = @Len -1;
End
Select @Result = Case When @testString Like @SearchPattern Then 1 Else 0 End;
IF (@Result = 0)
BEGIN
RAISERROR ('Value entered did not contain only A or B', 16, 1)
ROLLBACK TRANSACTION
END
END
SET ANSI_PADDING OFF
GO
【讨论】:
SELECT * FROM t
WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = ''
【讨论】: