यह फ़िल्टर्ड अनुक्रमित की कई सीमाओं में से एक है। LIKE
उपयोग करने के साथ इसे बायपास करने की कोशिश करना WHERE column01 LIKE '_____'
या तो काम नहीं करता है, एक ही त्रुटि संदेश का उत्पादन ( "गलत जहां क्लॉज ..." )।
VIEW
समाधान के अलावा , एक और तरीका यह होगा कि गणना किए गए कॉलम को एक नियमित कॉलम में परिवर्तित करें और एक CHECK
बाधा जोड़ें, ताकि इसमें हमेशा मान्य डेटा हो:
CREATE TABLE Table01 (column01 nvarchar(100),
column01_length int,
CHECK ( column01_length = len(column01)
AND column01 IS NOT NULL
AND column01_length IS NOT NULL
OR column01 IS NULL
AND column01_length IS NULL )
) ;
CREATE UNIQUE INDEX UIX_01 ON Table01 (column01) WHERE column01_length >= 5 ;
Rextester.com पर परीक्षण किया गया
स्वाभाविक रूप से, इसका मतलब है कि आपको column01_length
हर बार आबादी column01
(आवेषण और अपडेट पर) सही लंबाई के साथ स्पष्ट रूप से आबाद करने की आवश्यकता है । यह मुश्किल हो सकता है, क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि लंबाई की उसी तरह गणना की जाए जैसे कि टी-एसक्यूएल LEN()
फ़ंक्शन करता है। विशेष रूप से, अनुगामी रिक्त स्थान को अनदेखा करने की आवश्यकता होती है, जो जरूरी नहीं है कि विभिन्न प्रोग्रामिंग भाषाओं में डिफ़ॉल्ट रूप से लंबाई की गणना कैसे की जाती है जिसमें क्लाइंट एप्लिकेशन लिखे जाते हैं। लॉकर कॉल करने वाले के लिए खाते में आसान हो सकता है, लेकिन आपको होना चाहिए पहली जगह में अंतर के बारे में पता है।
कॉलम के लिए सही मान की आपूर्ति करने के लिए एक विकल्प एक INSERT/UPDATE
ट्रिगर 1 होगा , इसलिए यह क्लाइंट अनुप्रयोगों के लिए गणना के रूप में प्रकट होता है।
1 जैसा कि ट्रिगर में वर्णित बाधाओं की तुलना में , आपको इसके लिए ट्रिगर के INSTEAD का उपयोग करना होगा। एक AFTER ट्रिगर बस कभी निष्पादित नहीं होगा, क्योंकि अनुपस्थित लंबाई चेक की कमी को विफल कर देगी और बदले में ट्रिगर को चलने से रोकेगी। हालांकि, ट्रिगर के INSTEAD के अपने प्रतिबंध हैं ( त्वरित अवलोकन के लिए DML ट्रिगर योजना दिशानिर्देश देखें )।