2013-10-17 44 views
1

我以前曾经用过这个网站以获得过去的各种帮助,在这种情况下,我在搜索框中找不到任何东西,所以如果在别的地方存在道歉的话。函数返回2个不同的结果 - T-SQL

在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)[email protected]) 
     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数字号码,删除为se安全的原因)

####0000012 
#### 0012 0012 

问候, 路中号

+2

请包括函数头为好。更好的办法是包含足够的代码和数据,以便我们重现您所看到的内容。 – RBarryYoung

+0

您缺少大量信息 - 函数头,给定示例的输入和SP代码。 –

+0

我添加了更多的位和功能的其余部分,即时通讯有点新,所以不知道需要多少。我不能把整个SP放在这里,出于安全原因 –

回答

0
  1. 即使你已经定义stringlen为浮动,这将是一个整数值,因为你将两个值是整数。

  2. 有没有在您的意见中提到一个char(14)之间的差异,在varchar(14)。字符(14)保证为14个字符长。 varchar可能不是。

我觉得你的函数体可以更简洁地表示,因为这...

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)