【问题标题】:Regular expressions in SQL Server 2008SQL Server 2008 中的正则表达式
【发布时间】:2011-06-19 05:53:36
【问题描述】:

如何编写这个检查约束:

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

一些限制确实有效,但这个简单的无效。
排序有问题,还是什么?

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 你可以用 LIKE 做 [AB],所以如果你知道字符串的长度,你可以做 '[AB][AB][AB]' - 仍然不是一个好的解决方案
    • 对,这就是为什么我说'如果你知道字符串的长度 - 仍然不是一个好的解决方案':)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您想在 MSSQL 约束中使用完整功能的正则表达式 - 您需要编写自定义 dll 并将其附加到 sql 服务器。那么你就可以将它注册为一个本地函数,并以你喜欢的任何方式使用正则表达式。

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:
          SELECT * FROM t
          WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = ''
          

          【讨论】:

          • 如果您谈论 LIKE - 您可以说“[AB]”,但不能说“[AB]*”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-06
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 2012-09-19
          • 2010-09-16
          相关资源
          最近更新 更多