与(相对简单的)UDF返回字符串结果的行为不一致

时间:2013-10-09 17:24:16

标签: string tsql stored-procedures user-defined-functions

我正在编写一个函数,UNINTENTIONALLY似乎在不同的方式下工作,具体取决于它的调用方式。 该功能应该执行以下操作: 接受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

现在问题就在于此。如果我像这样调用这个函数:

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函数)正常工作!

但是,如果我像这样调用它: 来自sometable的SELECT dbo.fix_len(a,10),dbo.fix_len(b,10),dbo.fix_len(c,10),dbo.fix_len(d,10)

然后(fix_len函数或者sql server)想要将每个字段填充到max chars。

目前,我目前的目的是创建一个将字段连接在一起的文本文件。我通过bcp命令(在cmd shell中)调用存储过程。如果我在第一个选择中手动连接字符串,它工作正常。

但是,如果我让BCP搞清楚,它会将每个字段填满。但我不认为BCP是问题所在。如果我只是从查询窗口执行两个选择中的每一个,则第一个选择是正确的 - 第二个选择添加填充。

任何想法我做错了 - 同样重要的是,我能做些什么来解决它?

0 个答案:

没有答案