1

过去我曾使用此网站寻求各种帮助,在这种情况下,我在搜索框中找不到任何内容,因此如果其他地方存在此问题,我深表歉意。

在 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

4

1 回答 1

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

  2. char(14)您的评论中提到的 a与varchar(14). char(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)
于 2013-10-17T18:03:59.937 回答