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