代码之家  ›  专栏  ›  技术社区  ›  S M Kamran

SQL Server函数

  •  0
  • S M Kamran  · 技术社区  · 16 年前

    这个函数有什么问题…函数打算从给定字符串中删除指定的前导字符。我知道有一个基于patindex的解决方案,但是它不考虑空格和所有零项…但我想知道这个有什么问题…

    如果我输入“00012345”,它应该输出“12345”,但是我得到的输出是“0001234”。为什么?

    测试数据为:

    DECLARE @result varchar(max)
    EXEC @result = TrimLeadingChar '00012345'
    PRINT @result
    

    功能代码为:

    CREATE FUNCTION TrimLeadingChar
    (
        @st AS Varchar(max),
        @trimChar AS Varchar(1) = "0"
    )
    RETURNS Varchar(max)
    AS
    BEGIN
        DECLARE @index int
        DECLARE @temp Varchar(1)
        SET @index = 0
        if LEN(RTRIM(LTRIM(@st))) <= 1
            return @st;
        While(@index < LEN(@st))
        BEGIN
            set @temp = substring(@st,@index,1)        
            if @temp = @trimChar
                SET @index = @index + 1
            else
                Break;                   
        END
        Return substring(@st,@index, LEN(@st))
    END
    GO
    
    2 回复  |  直到 16 年前
        1
  •  4
  •   Anwar Chandra    16 年前
    set @temp = substring(@st,@index+1,1)
    

    而不是

    set @temp = substring(@st,@index,1)
    

    更新:

    或者首先设置@index=1

    DECLARE @index int
    DECLARE @temp Varchar(1)
    SET @index = 1
    

    然后

    设置@temp=子字符串(@st,@index,1)
    
        2
  •  1
  •   S M Kamran    16 年前

    仅供其他用户使用:以下是SQL Server的工作和完整的解决方案功能:

    CREATE FUNCTION TrimBothEndsAndRemoveLeadingChar
    (
        @st AS VARCHAR(MAX),
        @trimChar AS VARCHAR(1) = "0"
    )
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
        DECLARE @index INT
        DECLARE @temp VARCHAR(1)
    
        IF @st IS NULL OR @trimChar IS NULL OR LEN(RTRIM(LTRIM(@st))) <= 0
            RETURN @st
    
        SET @st = LTRIM(RTRIM(@st))    
        SET @index = 1    
        WHILE(@index <= LEN(@st))
        BEGIN
            SET @temp = SUBSTRING(@st, @index, 1)        
            IF @temp = @trimChar
                SET @index = @index + 1
            ELSE
                BREAK;                   
        END
    
        DECLARE @result VARCHAR(MAX)
        IF @index = (LEN(@st) + 1)
            SET @result = @st
        ELSE
            SET @result = SUBSTRING(@st, @index, LEN(@st) + 1)
        RETURN @result
    END
    GO
    
    推荐文章