2012-06-27 89 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