C# SQL Server 2008中的正则表达式

C# SQL Server 2008中的正则表达式,c#,.net,sql,regex,sql-server-2008,C#,.net,Sql,Regex,Sql Server 2008,如何写入此检查约束: [AB]+,varchar列,包含由A或B组成的非空字符串 有些约束确实有效,但这个简单的约束不起作用。 排序规则有问题吗?SQL server本机不支持正则表达式 SELECT * FROM t WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = '' 但是,可以添加检查约束以匹配您提供的模式 not like '%[^AB]%' 测试: LIKE模式非常有限。如果需要真正的正则表达式约束,可以实现非常简单的CLR函数。互联

如何写入此检查约束:

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

有些约束确实有效,但这个简单的约束不起作用。

排序规则有问题吗?

SQL server本机不支持正则表达式

SELECT * FROM t
WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = ''
但是,可以添加检查约束以匹配您提供的模式

not like '%[^AB]%'
测试:


LIKE
模式非常有限。如果需要真正的正则表达式约束,可以实现非常简单的CLR函数。互联网上有很多例子。例如:.

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


如果您对此有困难,我可以发布一个简单的示例,说明MSSQL的clr库不支持正则表达式。您可以编写一个自定义CLR用户定义函数来执行此操作。MSDN拥有丰富的资源来指导您完成创建过程。例如,这一点


此外,这似乎完全涵盖了您想要对检查约束执行的操作。它演示了如何将CLR UDF设置为检查约束。

如果使用上述其他人提供的检查约束(即[AB][AB]等),则无法灵活地正确测试varchar值,则可以尝试使用触发器

触发器将允许您更彻底地测试您的任务

在使用触发器跨表测试业务规则时,只需更改它以适应您需要执行的测试:)

希望这有帮助

示例代码可帮助您更改测试以满足您的需要

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

如果你谈论LIKE-你可以说“[AB]”,但你不能说“[AB]*”你可以用LIKE做[AB],所以你可以做“[AB][AB][AB]”如果你知道字符串的长度-仍然不是一个好的解决方案,对吧,这就是为什么我说“如果你知道字符串的长度-仍然不是一个好的解决方案”:
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