2012-08-13 47 views
3

進出口工作努力沒有拒絕其格式爲「03 XXXX XXXX」,所以我創建了一個表像正則表達式CHECK約束與SQL Server

create table records 
(
.... 
num varchar(255) NOT NULL, 
... 
CONSTRAINT num_check CHECK (num like '03 [0-9]{4} [0-9]{4}') 
) 

應(我想?)接受例如「所有輸入03 1234 1234「。但如果我嘗試通過SQL管理器添加此錯誤消息: 「INSERT語句與CHECK約束衝突」num_check「」

起初我認爲我的正則表達式已關閉,但是我試圖在很少有其他地方,它接受上面的例子。 有什麼想法?

+1

至於我知道你不能在SQL Server中實現Regex而不使用CLR程序集。它沒有像Oracle這樣的原生Regex支持......除非我的記憶讓我失望。 – scarpacci 2012-08-13 05:04:47

+0

我正在關注我在這裏看到的一些事情。 http://www.dbforums.com/microsoft-sql-server/714703-check-constraint-regular-expressions.html – TrewTzu 2012-08-13 05:05:46

+0

到目前爲止,我只找到一個支持posix regex約束的DBE,它是Oracle(參考: http://stackoverflow.com/questions/35157662/is-there-a-database-engine-that-allows-for-queriable-field-constraint-specified)。 MS SQL和DB2看起來像他們有自己的通配符變體,這是不幸的,因爲你鬆散層之間的約束一致性:( – 2016-02-02 16:52:06

回答

7

like不使用正則表達式的工作,它有自己的,更簡單的通配符模式,只支持%_[a-z][^a-z]。而已。 {4}將不起作用,就像大多數正則表達式一樣。
您應該能夠使用:

like '03 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]' 

另一種選擇,少一些重複:

declare @digitChar nvarchar(12) 
set @digitChar = '[0-9]' 

Where子句:

like '03 ' + replicate(@digitChar,4) + ' ' + replicate(@digitChar,4) 

例子:http://sqlfiddle.com/#!3/d41d8/3251

+0

,這將教我試圖使我的正則表達式更簡潔,謝謝Kobi – TrewTzu 2012-08-13 05:29:11

+1

@TrewTzu - 這就是問題 - '''不處理正則表達式 - 它只是'[]'是類似的。無論如何,我已經包含了另一個版本 - 我做了一些非常類似的檢查GUID時,並不希望'[0 -9a-fA-F]'重複32次... – Kobi 2012-08-13 05:34:01