我正在编写一个函数,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是问题所在。如果我只是从查询窗口执行两个选择中的每一个,则第一个选择是正确的 - 第二个选择添加填充。
任何想法我做错了 - 同样重要的是,我能做些什么来解决它?