有哪位大侠知道,在SQL Server中,我希望select len('我')显示的值为2,而select len('s')显示的值为1,这个要换成一个什么样的函数

解决方案 »

  1.   

    http://www.cnblogs.com/server-you/archive/2006/09/20/509945.aspx
      

  2.   

    好像也可以用datalength
    select datalength('a你')
    select len('a你')
      

  3.   

    create function f_lenb(@a varchar(500)) returns int as
    begin
      if len(@a)=0 return 0
      declare @i int,@j int
      select @i=1,@j=len(@a)*2
      while @i>=1 and @i<=@j
      begin
        if substring(convert(varbinary,@a),1,@i)=@a
        goto AA    
        set @i=@i+1
      end
    AA:  return @i
    end
    -----------------------------------写了个函数
    select dbo.f_lenb('我们a')--5
      

  4.   

    alter function f_lenb(@a varchar(500)) returns int as
    begin
      if len(isnull(@a,''))=0 return 0
      declare @i int
      select @i=1
      while @i>=1
      begin
        if substring(convert(varbinary,@a),1,@i)=@a
        goto AA    
        set @i=@i+1
      end
    AA:  return @i
    end
    --修饰下,注意右边的空格(包括全角空格)不被计算在内,所以右边要空格要作些修正
      

  5.   

    --想不到其它好办法只能再次修改
    alter function f_lenb(@a varchar(500)) returns int as
    begin
      if len(isnull(@a,''))=0 return 0
      declare @i int
      select @i=len(@a)
      while 1=1
      begin
        if substring(convert(varbinary,@a),1,@i)=@a
        goto AA    
        set @i=@i+1
      end
    AA:  return @i
    end
      

  6.   

    --提取英文
    IF OBJECT_ID('DBO.GET_STR') IS NOT NULL
    DROP FUNCTION DBO.GET_STR
    GO
    CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    WHILE PATINDEX('%[^a-z]%',@S) > 0
    BEGIN
    set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'')
    END
    RETURN @S
    END
    go
    --提取中文
    IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
    DROP FUNCTION DBO.CHINA_STR
    GO
    CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
    RETURNS VARCHAR(100)
    AS
    BEGIN
    WHILE PATINDEX('%[^吖-座]%',@S) > 0
    SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')
    RETURN @S
    END
    go
    declare @S varchar(3000)
    set @s='adfa1235ad好的'
    select len(DBO.GET_STR(@s))
    select 2*len(DBO.CHINA_STR(@s))
      

  7.   

    datelength()select datalength('我')
    select datalength('s')
    /*
                
    ----------- 
    2(所影响的行数为 1 行)            
    ----------- 
    1(所影响的行数为 1 行)
    */
      

  8.   

    晕了,把datalength当delphi里的内容了,9楼正确
      

  9.   

    楼主朋友,在SQL中len函数是检测参数有多少个字节长度的.一般的英文字符和标准ASCII字符都是一个字节,而像汉字,日文假名这些大字符都是用2个字节存储的,所以len('我')返回是2,而len('s')返回是1.如果您只是单纯想检测参数的长度,那么用datalength(字符型参数)就可以办到,它可以检测出字符串安标准字节编码时的长度,如果您想单方面统计大字符的个数,那么就要用unicode()函数了,函数返回大于256的值时说明参数是大字符,否则是标准ASCII字符.
      

  10.   


    code=SQL]
    select datalength('我')
    select datalength('csdn')
    [[/code]
      

  11.   

    --提取英文 
    IF OBJECT_ID('DBO.GET_STR') IS NOT NULL 
    DROP FUNCTION DBO.GET_STR 
    GO 
    CREATE FUNCTION DBO.GET_STR(@S VARCHAR(100)) 
    RETURNS VARCHAR(100) 
    AS 
    BEGIN 
    WHILE PATINDEX('%[^a-z]%',@S) > 0 
    BEGIN 
    set @s=stuff(@s,patindex('%[^a-z]%',@s),1,'') 
    END 
    RETURN @S 
    END 
    go  学习
      

  12.   

    谢谢各位大侠,方法我自己找到了,将我的解决方法贴出来给大家,一起学习
    DATALENGTH(CAST(@STRTEMP   AS   VARCHAR(1000))   COLLATE   CHINESE_PRC_BIN)-len(@STRTEMP),这样我就可以知道里面有多少个字符是点用两个字节的   
      

  13.   


    select datalength('我')
    select datalength('s')用这个函数