2012-06-27 8 views
6

BenSQL Server düzenli ifade kısıtlaması

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

aşağıda ekleme sorgusu yürütmeye çalışırken düzenli ifade JavaScript çalışıyor ve tablo başarıyla oluşturuldu, ancak aşağıda sorgu tarafından bir tablo oluşturmak, hata oluştu .

INSERT INTO testing VALUES('abcde12345'); 

hata mesajı

altına CHECK kısıtlaması "CK_ test _test_field__173876EA" ile çakışan INSERT deyimi listesidir. Çakışma veritabanı "TEST", "dbo.testing", "test_field" sütununda gerçekleşti.

Javascript ve SQL Server'da Normal İfade kullanımı arasında herhangi bir fark var mı?

Herhangi bir profesyonel yardım edebilir ???

+2

bakınız makale burada: http: //blogs.lessthandot

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

Bu, bu hack etrafında tam bir işlevdir. com/index.php/DataMgmt/DBProgramlama/sql-server-does-support-normal-expressi –

+0

David, sadece bir “LIKE” joker karakteriyle kontrol ettiklerini ve kullanım durumlarının bunun için yeterince basit olduğunu görebildiğim kadarıyla. Bu değil. – Joey

+0

http://stackoverflow.com/questions/267921/regular-expressions-in-sql-server-servers Gerçi regex özelliğini gerçekten etkinleştirip etkinleştirmediğinizden emin olun. – nhahtdh

cevap

4

LIKE does not use regular expressions.

Kendi fonksiyonları oluşturarak SQL Server düzenli ifade desteği ekleyebilir. .NET üzerinden bir yöntem this article'da ayrıntılandırılmıştır.

Durumda da ayrıca şunları da deneyebilirsiniz, ama oldukça değil:

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

Daha sonra ne yapmalıyım? Eğer bir regex eklemek istiyorsam yapmalıyım? –

+0

Tamam, anla, teşekkürler 12 –

+0

ikinci bağlantı yanlış (zaten?) – Jviaches

1

SQL Server POSIX regular expressions desteklemez, ancak yalnızca bir alt kümesi. Ayrıntılar için here adresine bakın.

+2

'LIKE' ifadeleri herhangi bir regex çeşidinin alt kümesi değildir.Farklı şekilde çalışırlar (örneğin, simge ve niceleyicilerin tüm kavramları yoktur). – Joey

+1

LIKE modeli, eşleşen" joker karakterlerini kullanabilir " Sıfır veya daha fazla karakter dizisi. "," Belirtilen aralıktaki herhangi bir karakter ([af]) veya set ([abcdef]) "," Belirtilen aralıkta olmayan herhangi bir karakter ([^ af]) veya set ([^ abcdef'ait])".IMHO bu regex karakter kümesi ve fren ifadeleri bir alt kümesidir. –

+0

'' '' joker karakterleri '.' 'Veya' .' ile normal ifadelerde gösterilebilir, ancak özellikle de joker karakterlerde tek bir anlamı vardır, oysa bir ifadeyle ifadeler içeren bir belirteci vardır. Bana göre iki farklı kavram var (evet, parantez ifadeleri aynıdır). Elbette joker karakterler, normal dillerin bir alt kümesi olan bir dizi dili tanımlayabilirler, ancak bu, bunları tanımlamak için kullanılan dilin normal ifadelerin bir alt kümesi olduğu anlamına gelmez. Gözlerimde çok farklı sözdizimi (ve hatta farklı metakarakterler) kullandığı için değil. – Joey

1

Bunun için bir çözüm var. Her karakteri kontrol etmek istediğiniz olduğundan, replika ile regex oluşturabilirsiniz:

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