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

时间:2009-04-10 20:38:38

标签: sql-server

我想限制我的varchar列只包含指定范围内的ascii字符,比如0-9或A-F(对于十六进制字符)我的约束是什么样的?

4 个答案:

答案 0 :(得分:2)

您可以轻松地将正则表达式应用于检查约束以执行此操作。

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)
)

答案 1 :(得分:2)

这是应该有用的东西:

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

答案 2 :(得分:1)

您正在存储号码。因此,您的列类型应为数字,即int。

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

答案 3 :(得分:0)

Etny使用双重否定显示了一个优雅的技巧!否则为了验证十六进制数字,我必须做(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),但它会在此处引发无效值的错误。所以它没有用。我希望有一个函数尝试解析,并在出现错误时返回null。也许类似于Parse vs. TryParse或者如果IsNumeric适用于Hex ......