มีปัญหากับสองคำตอบที่ได้รับการโหวตสูงสุด คำตอบที่แนะนำ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) เพื่อให้ได้คำตอบที่ถูกต้องแม้กระทั่งสำหรับสิ่งนั้น นอกจากนี้ควรจัดการกับสตริงที่มีคู่ตัวแทนอย่างถูกต้อง