SQL Server 2008中的正则表达式

本文关键字:正则表达式 2008 Server SQL | 更新日期: 2023-09-27 17:59:39

如何编写此检查约束:

[AB]+,varchar列,包含由A或b组成的非空字符串。

有些约束确实有效,但这个简单的约束不起作用
排序规则有问题吗?

SQL Server 2008中的正则表达式

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', '') = ''