【问题标题】:Can I make a SQL Server 2005 Table Column accept only letters and numbers?我可以让 SQL Server 2005 表列只接受字母和数字吗?
【发布时间】:2010-05-27 08:46:19
【问题描述】:

当我们有一列将存储一个只接受字母和数字的用户名时,我们总是使用 javascript 对此输入字段进行验证,甚至从代码中进行服务器验证.. 但我想知道是否有任何方法可以允许我对 Table 列本身进行此验证,即使有人尝试从它不接受的任何地方输入数据并抛出异常?

【问题讨论】:

    标签: regex sql-server-2005 validation


    【解决方案1】:

    您可以在列上使用check constraint 做一些事情。 T-SQL 本身没有正则表达式函数,尽管 LIKE(如下面的 AakashM 所述)足够聪明,可以做到这一点。要获得完整的正则表达式功能,您可以使用 CLR integration 包装 .Net Regex 函数,然后使用 UDF 包装正则表达式并使用检查约束调用该函数来评估列的内容。

    这里是another article,关于在 T-SQL 中使用 CLR UDF 进行正则表达式匹配。

    【讨论】:

    • 你能用LIKE做点什么吗?比如说,CHECK 该列是NOT LIKE [^a-zA-Z90-9]
    • 这是可能的,SQL 有 range [] 运算符,请参阅 mine & AakashM 的方法。
    • @AakashM - 同意。 LIKE 可能对 OP 的要求足够聪明。
    【解决方案2】:

    您可以在目标表上使用触发器并在执行插入之前验证输入。

    Read more about triggers

    【讨论】:

    • 但是如果插入数量很大,会不会特别影响性能?
    【解决方案3】:

    在我写这篇文章的时候被 AakashM 打败了,但无论如何这里是代码:

    CREATE TABLE #Table
    (
        Data VARCHAR(50) NOT NULL  CHECK(Data NOT LIKE '%[^a-zA-Z90-9]%')
    )
    
    INSERT INTO #Table(Data)
    VALUES ('123abc')
    
    GO
    
    INSERT INTO #Table(Data)
    VALUES ('123_abc')
    
    GO
    
    SELECT * FROM #Table
    
    DROP TABLE #Table
    

    请注意,该表达式是双重否定的,因此“Not like not (a-z or 0-9)”,因此 % 符号将捕获插入字符串中任何位置的违规行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多