0

次のシナリオ: このようなコードをインクリメントする必要があるため、DS0000001 次の項目はDS0000002、次DS0000003のようになります。

したがって、大きな INSERT ステートメントでこのコードを生成するために、次の関数を作成しました。

CREATE FUNCTION dbo.eufn_e5_importCRM_getNextClientCode(
  @partnerCode AS NVARCHAR(10),
  @number AS INT
    )
    RETURNS NVARCHAR(20)
    AS
    BEGIN
        DECLARE @next AS INT
        DECLARE @zeroes AS NVARCHAR(10)
        DECLARE @nextStr AS NVARCHAR(10)
        DECLARE @return AS NVARCHAR(20)
        DECLARE @partnerPrefix AS NVARCHAR(10)

        SELECT @next = RIGHT(c.clientCode,7) FROM Clients c

        SELECT @partnerPrefix = partners.partnerPrefix
          FROM partners WHERE partnerCode = @partnerCode
        SET @next = ISNULL(@next,0) + @number   
        SET @nextStr = CONVERT(NVARCHAR(10),@next)

        SELECT @zeroes = CASE WHEN @next > 9 THEN '00000'
                WHEN @next > 99 THEN  '0000'
                WHEN @next > 999 THEN  '000'
                WHEN @next > 9999 THEN  '00'
                WHEN @next > 99999 THEN  '0'
                WHEN @next > 999999 THEN  ''
                ELSE '000000'
        END

        IF ISNULL(@next,'') = ''
        BEGIN
            SET @return = @partnerPrefix + @zeroes + '1'
        END
        ELSE SET @return = @partnerPrefix + @zeroes + @nextStr

        RETURN @return
    END

@number-関数を使用して手動で挿入ステートメントに追加した行番号を取得しROW_NUMBER()ます。

これはすでに正常に機能しています。正しいコードがテーブルに挿入されます。

コードで気に入らないのは、次の部分です。

SELECT @zeroes = CASE WHEN @next > 9 THEN '00000'
        WHEN @next > 99 THEN  '0000'
        WHEN @next > 999 THEN  '000'
        WHEN @next > 9999 THEN  '00'
        WHEN @next > 99999 THEN  '0'
        WHEN @next > 999999 THEN  ''
        ELSE '000000'
END

私はすでにstackoverflowでしばらく検索し、グーグルでも検索しましたが、「0」をそのままにしておくconvertのような関数は見つかりませんでした。

この機能をより柔軟にし、可能であれば再利用可能にする方法はありますか?

助けてくれてありがとう!

4

1 に答える 1