SQL Server 2008中的正则表达式

时间:2011-06-19 05:53:37

标签: c# .net sql regex sql-server-2008

如何编写此检查约束:

[AB] + ,varchar列,非空字符串由A或B组成。

有些限制确实有效,这很简单 整理或其他问题?

5 个答案:

答案 0 :(得分:6)

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

LIKE模式非常有限。如果您需要真正的Regex约束,您可以实现非常简单的CLR功能。互联网上有很多例子。例如:Regular Expressions Make Pattern Matching And Data Extraction Easier

答案 1 :(得分:2)

SQL Server 2008本身不支持正则表达式。您可以编写一个自定义CLR用户定义函数来执行此操作。 MSDN拥有丰富的资源来指导您完成创建过程。例如,这是article

此外,这个article似乎完全涵盖了您想要检查约束的内容。它演示了如何将CLR UDF设置为检查约束。

答案 2 :(得分:1)

如果要在MSSQL约束中使用完整功能正则表达式 - 您需要编写自定义DLL并将其附加到sql server。然后你就可以将它注册为本地函数,并以任何你喜欢的方式使用regext。

请参阅http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx

如果您对此有困难 - 我可以发布一个为MSSQL工作clr库的简单示例

答案 3 :(得分:1)

如果使用上面其他人给出的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

答案 4 :(得分:0)

SELECT * FROM t
WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = ''