萊恩

返回字串的字元數。
注意:LEN 函式忽略尾隨空格:

SELECT LEN('My string'), -- returns 9
       LEN('My string   '), -- returns 9
       LEN('   My string') -- returns 12

如果需要包括尾隨空格的長度,則有幾種技術可以實現這一點,儘管每種技術都有其缺點。一種技巧是將單個字元附加到字串,然後使用 LEN 減去 1:

DECLARE @str varchar(100) = 'My string   '
SELECT LEN(@str + 'x') - 1 -- returns 12

這樣做的缺點是,如果字串變數或列的型別具有最大長度,則會丟棄額外字元的附加,並且結果長度仍然不會計算尾隨空格。為了解決這個問題,以下修改版本解決了這個問題,並在所有情況下都給出了正確的結果,代價是少量額外的執行時間,並且因此(正確的結果,包括代理對和合理的執行速度)似乎是最好的技術:

SELECT LEN(CONVERT(NVARCHAR(MAX), @str) + 'x') - 1

另一種技術是使用 theDATALENGTH 功能。

DECLARE @str varchar(100) = 'My string   '
SELECT DATALENGTH(@str) -- returns 12

重要的是要注意,雖然 DATALENGTH 返回記憶體中字串的長度(以位元組為單位)。這對於 varcharnvarchar 會有所不同。

DECLARE @str nvarchar(100) = 'My string   '
SELECT DATALENGTH(@str) -- returns 24

你可以通過將字串的資料長度除以單個字元的資料長度(必須是相同型別)來進行調整。下面的示例執行此操作,並且還處理目標字串恰好為空的情況,從而避免除以零。

DECLARE @str nvarchar(100) = 'My string   '
SELECT DATALENGTH(@str) / DATALENGTH(LEFT(LEFT(@str, 1) + 'x', 1)) -- returns 12

但即便如此,SQL Server 2012 及更高版本也存在問題。當字串包含代理項對時,它將產生不正確的結果(某些字元可能比同一字串中的其他字元佔用更多位元組)。

另一種技術是使用 REPLACE 將空格轉換為非空格字元,並取結果的 LEN。這在所有情況下都給出了正確的結果,但是使用長字串的執行速度非常差。