SQL Server 2008中的正则表达式
本文关键字:正则表达式 2008 Server SQL | 更新日期: 2023-09-27 17:59:39
如何编写此检查约束:
[AB]+,varchar列,包含由A或b组成的非空字符串。
有些约束确实有效,但这个简单的约束不起作用
排序规则有问题吗?
SQL server本机不支持Regex。
但是,可以添加检查约束以匹配您提供的模式
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
CCD_ 1模式非常有限。如果您需要真正的Regex约束,您可以实现非常简单的CLR函数。互联网上有很多例子。例如:正则表达式使模式匹配和数据提取更容易。
SQL server 2008本机不支持正则表达式。您可以编写一个自定义CLR用户定义函数来执行此操作。MSDN拥有丰富的资源来指导您完成创建MSDN的过程。例如,这篇文章。
此外,本文似乎正好涵盖了您想要对检查约束做什么。它演示了如何将CLR UDF设置为检查约束。
如果您想在MSSQL约束中使用全功能regex,您需要编写一个自定义dll并将其附加到sql server。然后,您可以将其注册为本地函数,并以任何方式使用regext。
参见http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx.
如果您对此有异议,我可以发布一个为MSSQL工作clr库的简单示例
如果使用上面其他人给出的Check约束(即[AB][AB]等),不能让您灵活地正确测试varchar值,那么您可以尝试使用触发器。
触发器会让你更彻底地测试你的追求。
请参阅此链接上的示例C,同时它使用触发器跨表测试业务规则,只需将其更改为适合您需要进行的测试即可:)
希望这能帮助
示例代码帮助您更改测试以满足您的需求
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', '') = ''