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

印刷される行は次のとおりです。

 ####0000012   
 #### 0012 0012

よろしく、ルークM

4

1 に答える 1

0
  1. float として定義stringlenしたとしても、除算する 2 つの値は int であるため、整数値になります。

  2. char(14)コメントで言及されている a と 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 に答える