CHAR/VARCHAR要定義長度默認長度為1

字號:

語句
    select 'K'+substring(cast([收費起點樁號]as char),0,charindex('.', cast([收費起點樁號]as char)))+'+'+substring(cast([收費起點樁號]as char),charindex('.', cast([收費起點樁號]as char))+1,4) as 收費起點樁號
    from tb_fs_公路收費站分布情況表
    返回的結(jié)果是正確的,假如[收費起點樁號]是200.020 ,則結(jié)果為K200+020,如果[收費起點樁號]是310.520,則結(jié)果為
    K310+520。
    但是我把合成字符串的提取為函數(shù)再調(diào)用(select CovertToStakeNO([收費起點樁號]) from tb_fs_公路收費站分布情況表 )后,結(jié)果卻非預(yù)期值:如果[收費起點樁號]是200.020,則返回2,如果[收費起點樁號]是310.520,則返回3。函數(shù)體如下:
    -- Description: 將real型的樁號轉(zhuǎn)換為樁號形式
    alter function CovertToStakeNO
    (
    @StakeNOColumnName real
    )
    RETURNS nchar
    AS
    BEGIN
    declare @tostring nchar (10);
    declare @indexofpoint int;
    set @tostring = (select cast(@StakeNOColumnName as char) );
    set @indexofpoint=charindex('.',@tostring );
    return @tostring --('K'+substring(@tostring,0,@indexofpoint)+'+'+substring(@tostring ,@indexofpoint+1,4))
    END
    GO
    最終改為:
    alter function CovertToStakeNO
    (
    @StakeNOColumnName decimal(8,3)
    )
    RETURNS nchar(20)
    AS
    BEGIN
    declare @tostring nchar (20);
    declare @indexofpoint int;
    set @tostring = (select cast(@StakeNOColumnName as char) );
    set @indexofpoint=charindex('.',@tostring );
    return @tostring --('K'+substring(@tostring,0,@indexofpoint)+'+'+substring(@tostring ,@indexofpoint+1,4))
    END
    GO
    出錯原因:
    1)使用CHAR/VARCHAR要定義長度,不然默認長度為1,也就是為什么得到1個字符的原因
    2)[收費起點樁號]數(shù)據(jù)類型錯了,不是real ,而是decimal(8,3)