दो शीर्ष मतदान उत्तरों के साथ समस्याएं हैं। अनुशंसा करने वाला उत्तर DATALENGTHप्रोग्रामर त्रुटियों से ग्रस्त है। परिणाम को प्रकारों के DATALENGTHलिए 2 से विभाजित किया जाना चाहिए NVARCHAR, लेकिन VARCHARप्रकारों के लिए नहीं । इसके लिए आवश्यक है कि आपको जिस प्रकार की लंबाई मिल रही है, और यदि वह प्रकार बदलता है, तो आपको अपने द्वारा उपयोग किए जाने वाले स्थानों को परिश्रम से बदलना होगा DATALENGTH।
सबसे अपवित्र उत्तर के साथ एक समस्या भी है (जो मैं मानता हूं कि यह करने के लिए मेरा पसंदीदा तरीका था जब तक कि यह समस्या मुझे नहीं हो जाती)। यदि आप जिस चीज की लंबाई प्राप्त कर रहे हैं वह प्रकार की है NVARCHAR(4000), और इसमें वास्तव में 4000 वर्णों की एक स्ट्रिंग शामिल है, तो SQL परिणाम को डाले जाने के बजाय संलग्न चरित्र को अनदेखा करेगा NVARCHAR(MAX)। अंतिम परिणाम एक गलत लंबाई है। यही बात VARCHAR (8000) के साथ भी होगी।
मैंने जो काम पाया है, वह लगभग उतना ही तेज है, जितना पुराना है LEN, LEN(@s + 'x') - 1बड़े तार की तुलना में तेज़ है , और यह अंतर्निहित वर्ण चौड़ाई को नहीं मानता है:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
यह डटलट्रोम प्राप्त करता है, और फिर स्ट्रिंग से किसी एकल वर्ण के डटलट्रोम द्वारा विभाजित होता है। 'X' का परिशिष्ट उस मामले को शामिल करता है जहां स्ट्रिंग खाली है (जो उस मामले में शून्य से भाग देगा)। यह काम करता @sहै VARCHARया नहीं NVARCHAR। LEFTएपेंड करने से पहले 1 वर्ण का करना कुछ समय के लिए होता है जब स्ट्रिंग बड़ी होती है। हालांकि इसके साथ समस्या यह है कि यह सरोगेट जोड़े वाले तारों के साथ सही ढंग से काम नहीं करता है।
उपयोग किए गए उत्तर के लिए एक टिप्पणी में वर्णित एक और तरीका है REPLACE(@s,' ','x')। यह तकनीक सही उत्तर देती है, लेकिन जब स्ट्रिंग बड़ी होती है तो यह अन्य तकनीकों की तुलना में परिमाण को धीमा करने का एक युगल आदेश है।
किसी भी तकनीक का उपयोग करने पर सरोगेट जोड़े द्वारा पेश की गई समस्याओं को देखते हुए DATALENGTH, मुझे लगता है कि सबसे सुरक्षित तरीका है जो सही उत्तर देता है जो मुझे पता है कि निम्नलिखित हैं:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
यह REPLACEतकनीक से तेज है , और लंबे समय तक तार के साथ बहुत तेज है। मूल रूप से यह तकनीक तकनीक है LEN(@s + 'x') - 1, लेकिन किनारे के मामले के लिए सुरक्षा के साथ जहां स्ट्रिंग की लंबाई 4000 (nvarchar) या 8000 (varchar के लिए) है, ताकि उसके लिए भी सही उत्तर दिया जा सके। यह भी सरोगेट जोड़े के साथ तार को सही ढंग से संभालना चाहिए।