2012-06-27 13 views
6

मैं नीचेएसक्यूएल सर्वर नियमित अभिव्यक्ति बाधा

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

नियमित अभिव्यक्ति जावास्क्रिप्ट में काम कर रहा है और मेज सफलतापूर्वक बनाया गया था, लेकिन जब मैं नीचे डालने क्वेरी को निष्पादित करने की कोशिश कर रहा क्वेरी से एक तालिका बनाने, त्रुटि हुई ।

INSERT INTO testing VALUES('abcde12345'); 

त्रुटि संदेश नीचे

सम्मिलित करें के विवरण की जांच बाधा "CK_ परीक्षण _test_field__173876EA" के साथ विरोध हुआ लिस्टिंग है। संघर्ष डेटाबेस "टेस्ट", तालिका "dbo.testing", कॉलम 'test_field' में हुआ।

क्या जावास्क्रिप्ट और SQL सर्वर में नियमित अभिव्यक्ति का उपयोग करने के बीच कोई अंतर है?

कोई भी समर्थक मदद कर सकता है ???

+2

लेख देखें यहाँ: http: //blogs.lessthandot

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

यह इस हैक के चारों ओर एक पूर्ण कार्य है। com/index.php/DataMgmt/DBProgramming/sql-server-do-support-regular-expressi –

+0

डेविड, जहां तक ​​मैं देख सकता हूं कि सिर्फ 'LIKE' वाइल्डकार्ड अभिव्यक्ति के साथ जांच करता है और उनके उपयोग के मामले के लिए पर्याप्त सरल है। यह एक नहीं है। – Joey

+0

http://stackoverflow.com/questions/267921/regular-expressions-in-sql- सर्वर- सर्वर यह सुनिश्चित नहीं करते कि आप वास्तव में regex सुविधा को सक्रिय कर रहे हैं या नहीं। – nhahtdh

उत्तर

4

LIKE does not use regular expressions.

आप अपनी खुद की कार्यों बनाने के द्वारा एसक्यूएल सर्वर के लिए नियमित अभिव्यक्ति समर्थन जोड़ सकते हैं। .NET के माध्यम से एक विधि this article में विस्तृत है।

आपके मामले में आप भी निम्नलिखित कोशिश कर सकते हैं, लेकिन यह काफी नहीं है:

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

तो मुझे क्या करना चाहिए यदि मैं कंसट्रेंट में रेगेक्स जोड़ना चाहता हूं? –

+0

ठीक है, इसे प्राप्त करें, वैसे भी धन्यवाद :) –

+0

दूसरा लिंक गलत है (पहले से ही?) – Jviaches

1

Sql सर्वर POSIX regular expressions का समर्थन नहीं करता है, लेकिन केवल एक सबसेट।

विवरण के लिए here देखें।

+2

'LIKE' अभिव्यक्ति किसी भी रेगेक्स स्वाद का सबसेट नहीं है। वे अलग-अलग काम करते हैं (यानी टोकन और क्वांटिफायर की पूरी अवधारणा अनुपस्थित हैं) – Joey

+1

LIKE पैटर्न वाइल्डकार्ड का उपयोग कर सकता है जो " शून्य या अधिक वर्णों की कोई स्ट्रिंग। "," निर्दिष्ट सीमा ([af]) या सेट ([abcdef]) के भीतर कोई एकल वर्ण "," निर्दिष्ट वर्ण ([^ af]) या सेट के भीतर कोई एकल वर्ण नहीं है ([^ abcdef]) "।आईएमएचओ यह रेगेक्स चरित्र सेट और ब्रैकेट एक्सप्रेशन का सबसेट है। –

+0

वाइल्डकार्ड '%' और '_' को नियमित अभिव्यक्तियों में'। * 'या' .' के साथ प्रदर्शित किया जा सकता है लेकिन विशेष रूप से पूर्व में वाइल्डकार्ड में एक अर्थ है जबकि यह रेगेक्स में क्वांटिफायर के साथ एक टोकन है। मेरे लिए यह दो बहुत ही अलग अवधारणाएं हैं (हां, ब्रैकेट अभिव्यक्ति समान हैं)। बेशक वाइल्डकार्ड उन भाषाओं के एक समूह का वर्णन कर सकते हैं जो नियमित भाषाओं का उप-समूह है, लेकिन इसका मतलब यह नहीं है कि उनका वर्णन करने के लिए उपयोग की जाने वाली भाषा नियमित अभिव्यक्तियों का एक उप-समूह है। मेरी आंखों में ऐसा इसलिए नहीं है क्योंकि यह बहुत अलग वाक्यविन्यास (और यहां तक ​​कि विभिन्न मेटाएक्टेक्टर) का उपयोग करता है। – Joey

1

इसके लिए एक कामकाज है। आप हर चरित्र की जांच करना चाहते, इसलिए आप को दोहराने के साथ regex उत्पन्न कर सकते हैं:

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 
संबंधित मुद्दे