【发布时间】:2010-05-27 08:46:19
【问题描述】:
当我们有一列将存储一个只接受字母和数字的用户名时,我们总是使用 javascript 对此输入字段进行验证,甚至从代码中进行服务器验证.. 但我想知道是否有任何方法可以允许我对 Table 列本身进行此验证,即使有人尝试从它不接受的任何地方输入数据并抛出异常?
【问题讨论】:
标签: regex sql-server-2005 validation
当我们有一列将存储一个只接受字母和数字的用户名时,我们总是使用 javascript 对此输入字段进行验证,甚至从代码中进行服务器验证.. 但我想知道是否有任何方法可以允许我对 Table 列本身进行此验证,即使有人尝试从它不接受的任何地方输入数据并抛出异常?
【问题讨论】:
标签: regex sql-server-2005 validation
您可以在列上使用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] ?
您可以在目标表上使用触发器并在执行插入之前验证输入。
【讨论】:
在我写这篇文章的时候被 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)”,因此 % 符号将捕获插入字符串中任何位置的违规行为。
【讨论】: