函数返回2个不同的结果 - T-SQL

时间:2013-10-17 15:04:22

标签: sql sql-server

我以前曾使用过这个网站,以获取过去各种事情的帮助,在这种情况下,我在搜索框中找不到任何内容,所以如果在其他地方存在,请道歉。

在sql server 2005中,我有几个存储过程可以更改各种代码,最近我们创建了一个向定义的字符串添加空格的函数。所以从理论上讲,我将一个字符串传递给它,然后我得到一个结果为4的块。当我手动运行,并定义实际文本时,它分割得很好(我得到#### 0000 012返回)但是当我执行SP内的功能,我得到了#### 0012 0012。有什么理由吗?

我在将字符串传递到我的函数之前已经为字符串设置了一个打印命令,并打印出“#### 0000012”,之后的打印是“#### 0012 0012”

下面是功能代码,没有声明:

 set ANSI_NULLS ON
 set QUOTED_IDENTIFIER ON
 GO


 ALTER function [dbo].[udf_addspaces](@string varchar(255),@lengthbetween int)
 returns varchar(100)
 as
 BEGIN
    declare @i int, @stringlen float, @output varchar(255), @outputofloop varchar(4)

    set @stringlen = LEN(@string)/@lengthbetween
    set @output =''
    set @i = 0
    while @i <= @stringlen
    BEGIN
        set @outputofloop = left(@string,@lengthbetween)

        if @lengthbetween < LEN(@string)
        BEGIN
            set @string = right(@string,LEN(@string)-@lengthbetween)
        END

        set @output = @output + @outputofloop +' '

        set @i = @i+1
    END
    return @output
 END

这是执行此操作的SP的位:

 set @Consignment2 = (@Consignment) + rtrim(@Check14)
 print @Consignment2
 set @Consignment2 = dbo.udf_addspaces(@Consignment2,4)
 print @Consignment2

以下是它打印的行:(注意:####替换了一个4位数字,出于安全原因删除了)

 ####0000012   
 #### 0012 0012

此致 卢克M

1 个答案:

答案 0 :(得分:0)

  1. 即使您已将stringlen定义为浮点数,它也会是一个整数值,因为您要划分的两个值是整数。

  2. 评论中提到的char(14)varchar(14)之间存在差异。 char(14)保证长度为14个字符。 varchar可能不是。

  3. 我认为你的功能主体可以更简洁地表达为......

    declare @result varchar(500)
        select @result = '' 
        select 
            @result = @result 
                + substring(@string, number*@lengthBetween+1, @lengthBetween) 
                + ' '
        from master..spt_values 
        where type='p' 
        and number <= (len(@string)/@lengthBetween)
    
        return rtrim(@result)