呼び出し方法によって、意図せずに動作が異なるように見える関数を書いています。この関数は次のことを行う必要があります: 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番目の選択でパディングが追加されます。
私が間違っていること、そして同様に重要なことに、それを修正するために何ができるでしょうか?