SQL 函数 Return 适当长度的字符串

SQL Function Return Appropriate Length String

下面是一个将输入字符串填充到输入字符串指定端所需长度的函数。当由 SSIS 执行时,元数据不是 return 所需的长度。我需要它 return 适合 SSIS 的数据长度。

CREATE FUNCTION [dbo].[udf_FillField] 
(
    @StringOrg nvarchar(max), --Original string
    @LengthOfStringOutPut int, --Length of output sting
    @FillChr nvarchar(1), --Char to pad the original string
    @LRJustified nvarchar(1) --Left or right justified
)
RETURNS nvarchar(max)
AS
BEGIN

    --  Declare Variable(s)
    DECLARE @Result nvarchar(max)

    --  Left Justified
    IF @LRJustified = 'L'
        BEGIN 
            SET @Result = 
                LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut) + 
                REPLICATE(@FillChr, (@LengthOfStringOutPut - LEN(LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut))))
        END 
    --  Right Justified
    IF @LRJustified = 'R'
        BEGIN
            SET @Result = 
                REPLICATE(@FillChr, (@LengthOfStringOutPut - LEN(LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut)))) + 
                LEFT(ISNULL(@StringOrg, ''), @LengthOfStringOutPut) 
        END
    --  Incorrect Parameter Input
    IF @LRJustified <> 'R' AND @LRJustified <> 'L'
        BEGIN
            SET @Result = 
                NULL
        END

    --  Output Data
    RETURN @Result
END

您的 UDF 定义为返回 nvarchar(max)。 SSIS 将查看该函数的元数据,查看它指定它 returns nvarchar(max) 或 DT_NTEXT,因为 SSIS 将对其进行分类,然后完成验证。

您能够使用函数的唯一方法是将结果显式转换为适当的大小。

SELECT
    CAST(dbo.udf_FillField(T.col1, 100, N'X', N'R') AS nvarchar(100)) AS Col1
FROM
    dbo.MyTable AS T;

附带说明一下,UDF 感觉就像代码重用,这就是我们作为开发人员所接受的教育。但在 SQL 服务器中,它们是可憎的,因为优化器无法为函数需要多少工作产生准确的成本,所以它猜测,100 次中有 100 次,它可能是错误的。您将获得所封装的任何业务逻辑的一致实施,但根据所需的数据量和逻辑,性能损失可能会很严重。