0

呼び出し方法によって、意図せずに動作が異なるように見える関数を書いています。この関数は次のことを行う必要があります: ACCEPT 2 つのパラメーター、文字列、および整数 1 文字から数千文字までの任意の長さの可変長の文字列を 1 つ返します。

文字列が null の場合、関数は整数パラメーターに等しいスペースの文字列を返します。文字列が長さよりも短い場合は、文字列を目的の長さにパディングします。文字列が長さよりも長い場合、トリミングされた文字列が返されます。文字列が正しい長さの場合、文字列が返されます。

入力文字列と出力文字列は、長さに関係なく、任意の文字列変数に対して機能する必要があります。

USE [mydb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fix_len]
(
    @v varchar(max),
    @len_v int
)
RETURNS varchar(max)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @cur_len as int
    DECLARE @ret_val as varchar(max)

    set @ret_val = ISNULL(@v, space(@len_v))
    set @cur_len = dataLENgth(@ret_val)

    set @ret_val = case when @cur_len < @len_v then @ret_val + SPACE(@len_v-@cur_len)
                        when @cur_len > @len_v then SUBSTRING(@ret_val,1, @len_v)
                        else @ret_val
                   end

    RETURN @ret_val

END

ここで問題です。この関数を次のように呼び出す場合:

sometable から dbo.fix_len(a, 10) + dbo.fix_len(b, 10) + dbo.fix_len(c, 10) + dbo.fix_len(d, 10) を選択します。

それ(fix_len関数)はうまく機能します!

ただし、次のように呼び出すと: SELECT dbo.fix_len(a, 10), dbo.fix_len(b, 10), dbo.fix_len(c, 10), dbo.fix_len(d, 10) from sometable

次に、それ (fix_len 関数またはおそらく SQL サーバー) は、各フィールドを最大文字数まで埋めたいと考えています。

現時点でのこれの現在の目的は、フィールドを連結するテキスト ファイルを作成することです。(cmd シェルで) bcp コマンドを使用してストアド プロシージャを呼び出します。最初の選択のように、自分で文字列を手動で連結すると、正常に動作します。

ただし、BCP にそれを理解させると、各フィールドがパディングされます。しかし、私はBCPが問題だとは思いません。クエリウィンドウから2つの選択をそれぞれ実行すると、最初の選択が正しく、2番目の選択でパディングが追加されます。

私が間違っていること、そして同様に重要なことに、それを修正するために何ができるでしょうか?

4

0 に答える 0