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

String 与(相对简单的)UDF返回字符串结果的行为不一致,string,tsql,stored-procedures,user-defined-functions,String,Tsql,Stored Procedures,User Defined Functions,我正在编写一个函数,根据调用方式的不同,该函数在无意中似乎工作方式有所不同。 该函数应执行以下操作: 接受两个参数,一个字符串和一个整数 返回1个可变长度的字符串,长度可以是1到数千个字符之间的任意长度 如果字符串为null,则函数返回一个等于整数参数的空格字符串。 如果字符串比长度短,它会将字符串填充到所需的长度。 如果字符串长于长度,它将返回一个裁剪过的字符串。 如果字符串长度正确,它将返回字符串 无论长度如何,输入字符串和输出字符串都应适用于任何字符串变量 USE [mydb] GO SE

我正在编写一个函数,根据调用方式的不同,该函数在无意中似乎工作方式有所不同。 该函数应执行以下操作: 接受两个参数,一个字符串和一个整数 返回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\u lena、10+dbo.fix\u lenb、10+dbo.fix\u lenc、10+dbo.fix\u lend、10

然后它的修复函数工作得很好

但是,如果我这样调用它: 从sometable中选择dbo.fix_lena,10,dbo.fix_lenb,10,dbo.fix_lenc,10,dbo.fix_lend,10

然后使用fix_len函数,或者sql server希望将每个字段填充到最大字符数

我目前的目的是创建一个文本文件,将字段连接在一起。我通过cmdshell中的bcp命令调用存储过程。如果我像在第一个select中那样手动连接字符串,那么效果很好

然而,如果我让BCP来解决这个问题,它会将每个字段填充出来。但我认为BCP不是问题所在。如果我只是从一个查询窗口中执行两个选择中的每一个,那么第一个选择是正确的——第二个选择添加了填充


你知道我做错了什么吗?同样重要的是,我能做些什么来修复它?

无法重现你的问题:选择“['+dbo.fix_lennull,3+']+'['+dbo.fix_len'aa',3+'+'['+dbo.fix_len'aaaaaaaa',3+'+'+dbo.fix_len'aaaaaaaaaaaaaa',3+']'选择“['+dbo.fix_lennull,3+''['+dbo.fix_len'aaaaaaaa',3+'],“['+dbo.fix_len'aaaaaaaaaaaa',3+']”它们都会产生相同的结果。你不能只做CASTa AS CHAR10+CASTb AS CHAR10+…?哥们,很有趣。我想我们正在使用MS server 10。我想知道这是否会有区别。Eric,我不知道我能做得到。我会试试。