2013-10-17 46 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)