declare @a bigint
set @a=123select len(123),datalength(123)
--结果:
----------- ----------- 
3           4(所影响的行数为 1 行)
select len(@a),datalength(@a)--结果:
----------- ----------- 
3           8(所影响的行数为 1 行)

解决方案 »

  1.   

    通过上面的示例更能说明问题DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。int占用的字节数是4,bigint的占用字节数是8
    len返回的是字符串的个数,123这个字符串(注意不是数字了),它的字符个数当然是3
      

  2.   

    --再看看这个,这下应该看得出来了吧?select len(123456),datalength(123456)----------- ----------- 
    6           4(所影响的行数为 1 行)
      

  3.   

    CHARINDEX与patindex,比较一下语法,差异就知道了.
    CHARINDEX
    返回字符串中指定表达式的起始位置。 语法
    CHARINDEX ( expression1 , expression2 [ , start_location ] ) PATINDEX
    返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。语法
    PATINDEX ( '%pattern%' , expression ) 
      

  4.   

    charindex有这个参数:start_location 
    patindex没有这个参数.另外,charindex用于ntext/text字段时,只能处理前8000个字节