代码之家  ›  专栏  ›  技术社区  ›  Haoest

使用用户定义的约束创建列

  •  0
  • Haoest  · 技术社区  · 16 年前

    我想将varchar列限制为在指定的范围内只有ASCII字符,比如说0-9或a-f(对于十六进制字符),我的约束是什么样子的?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Jason Coyne    16 年前

    您可以很容易地将regex表达式应用于check约束来执行此操作。

    CREATE TABLE [Account]
    (
        [AccountNumber] nvarchar(20) CHECK (dbo.RegexMatch( 
            [AccountNumber], '^[A-Z]{3,5}\d{5}-\d{3}$' ) = 1),
        [PhoneNumber] nchar(13) CHECK (dbo.RegexMatch( 
            [PhoneNumber], '^\(\d{3}\)\d{3}-\d{4}$' ) = 1),
        [ZipCode] nvarchar(10) CHECK (dbo.RegexMatch( 
            [ZipCode], '^\d{5}(\-\d{4})?$' ) = 1)
    )
    
        2
  •  2
  •   Etni    16 年前

    以下是一些应该有效的方法:

    CREATE TABLE #TMP
    (
        TEST nvarchar(20) CHECK ( TEST NOT LIKE '%[^A-F0-9]%' )  
    )
    
    INSERT INTO #TMP values('A1') -- WORKS
    INSERT INTO #TMP values('G1') -- FAILS
    
        3
  •  1
  •   tpdi    16 年前

    您正在存储 . 因此,您的列类型应该是一个数字,一个int。

    在显示时,将该数字转换为十六进制表示形式,可以在前端,也可以在服务器上使用用户定义的函数。

        4
  •  0
  •   Community CDub    8 年前

    埃尼用双重否定法展示了一个优雅的技巧!否则为了验证十六进制数,我必须做一些类似的事情 (Mac LIKE '[a-f0-9][a-f0-9][a-f0-9]'..12 times) 因为我正在验证一个mac地址,而且很烦人,所以您不能像这样指定重复 \d{12} 在正则表达式中。另外,我需要它有一个固定的大小,所以这里是我的适应:

    CREATE TABLE #HexTest
    (
        Mac varchar(12)
            CONSTRAINT CK_Mac_12Hex_Only --names make error msgs useful!
            CHECK (Mac NOT LIKE '%[^a-f0-9]%' AND LEN(Mac) = 12)  
    )
    
    INSERT INTO #HexTest values('5ca1ab1eD00d')     -- good
    INSERT INTO #HexTest values('DeadDa7aba5e')     -- good
    INSERT INTO #HexTest values('Dad`sDebac1e')     -- bad chars
    INSERT INTO #HexTest values('Ca5cadab1e')       -- too short
    INSERT INTO #HexTest values('Deba7ab1eDeal')    -- too long, fails for size    
    DROP TABLE #HexTest
    

    我试着这样做:

    CHECK (len(CONVERT(binary(6), Mac, 2)) = 6)
    

    (在Oracle中与 hextoraw ,但它在此处对无效值引发错误。所以没用。我希望有一个函数尝试解析,并在出现错误时返回空值。可能有点像 Parse vs. TryParse 或者如果 IsNumeric 为Hex工作…