莱恩

返回字符串的字符数。
注意: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。这在所有情况下都给出了正确的结果,但是使用长字符串的执行速度非常差。