2012-06-27 64 views
6

我通过查询创建下面SQL Server的正则表达式约束

CREATE TABLE testing(
    test_field VARCHAR(20) CHECK(test_field like '^[a-zA-z0-9]{6,20}$') 
); 

正则表达式是工作在Javascript和表创建成功,但是当我试图下面执行插入查询表,发生错误。

INSERT INTO testing VALUES('abcde12345'); 

的错误信息列表下方的

INSERT语句冲突与CHECK约束 “CK_ 测试 _test_field__173876EA”。冲突发生在数据库“TEST”,表“dbo.testing”,列'test_field'。

在JavaScript和SQL Server中使用正则表达式有什么区别吗?

任何亲们可以帮助???

+2

见文章在这里:HTTP://blogs.lessthandot。 COM /的index.php/DataMgmt/DBProgramming/SQL的服务器不支持-常规expressi –

+0

大卫,据我可以看到,仅仅在'LIKE'通配符表达式检查其使用情况是足够简单。这一个不是。 – Joey

+0

http://stackoverflow.com/questions/267921/regular-expressions-in-sql-server-servers虽然不确定是否实际上激活了正则表达式功能。 – nhahtdh

回答

4

LIKE does not use regular expressions.

您可以通过创建自己的功能添加到SQL Server的正则表达式支持。 this article中详细介绍了一种通过.NET的方法。

你的情况,你也可以尝试以下方法,但它并不漂亮:

test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
OR test_field LIKE '[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]' 
+0

那么我应该怎么做,如果我想在constrant添加一个正则表达式? –

+0

好,得到它,我还是谢谢你:) –

+0

第二个链接是不正确的(已经?) – Jviaches

1

SQL Server不支持POSIX regular expressions,但只有一个子集。

详见here

+2

'LIKE'表情都没有任何味道的正则表达式的一个子集,它们的工作方式不同(即令牌和量词的整个概念是不存在的)。 – Joey

+1

LIKE模式可使用通配符匹配“任何单个字符不在指定范围内([^ af])或设置([af])或设置([abcdef])“ [^ abcdef])中”。恕我直言,这是正则表达式的一个子集。 –

+0

通配符''''''''可以用'。*'或'.'在正则表达式中表示,但特别是前者在通配符中具有单一含义,而在正则表达式中则是具有量词的标记。对我来说,这是两个非常不同的概念(是的,括号表达式是相同的)。当然,通配符可以描述一组作为常规语言子集的语言,但这并不意味着用于描述它们的语言是正则表达式的一个子集。在我看来,这不是因为它使用了非常不同的语法(甚至是不同的元字符)。 – Joey

1

这是一个解决方法。既然你要检查每一个字符,你可以重复生成的正则表达式:

SET @pattern = replicate('[a-zA-Z0-9]', LEN(@VAL)); 

这是解决这个黑客全功能:

create function dbo.example (@VAL varchar(32)) 
RETURNS bit 
WITH EXECUTE AS CALLER 
AS 
BEGIN 
    DECLARE @pattern varchar(512); 
    SET @pattern = replicate('[a-zA-Z0-9]', LEN(@VAL)); 
    IF @VAL like @pattern 
    BEGIN 
     RETURN 1; 
    END; 
    RETURN 0; 
END; 
GO