0

我正在编写一个函数,根据它的调用方式,该函数的工作方式似乎有所不同。该函数应执行以下操作: ACCEPT 2 个参数、一个字符串和一个整数 返回 1 个可变长度的字符串,其长度可以是 1 到几千个字符之间的任何长度。

如果字符串为空,则函数返回一个等于整数参数的空格字符串。如果字符串比长度短,它会将字符串填充到所需的长度。如果字符串长于长度,它将返回一个裁剪后的字符串。如果字符串的长度正确,它将返回字符串。

无论长度如何,输入字符串和输出字符串都应该适用于任何字符串变量。

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

现在问题来了。如果我像这样调用这个函数:

从某个表中选择 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 server)想要将每个字段填充到最大字符。

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

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

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

4

0 回答 0