【问题标题】:SQL Function Return Appropriate Length StringSQL 函数返回适当长度的字符串
【发布时间】:2015-08-03 14:24:22
【问题描述】:

下面是一个在输入字符串的指定侧将输入字符串填充到所需长度的函数。当由 SSIS 执行时,元数据没有返回所需的长度。我需要它将适当的数据长度返回给 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

【问题讨论】:

  • 它正在返回 nvarchar(max) SSIS 没有增加那个长度吗?
  • 这就是我遇到的问题。我需要它来获取实际输出的长度。如果返回长度为 30 的字符串,我需要 SSIS 来获取长度为 30 的字符串。此函数用于生成非常大文件的查询。每列都有特定的长度,因为它是固定宽度的文件格式。

标签: ssis sql-server-2008-r2


【解决方案1】:

您的 UDF 被定义为返回 nvarchar(max)。 SSIS 将查看函数的元数据,看到它指定它返回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 Server 中,它们是可憎的,因为优化器无法为函数需要多少工作产生准确的成本,所以它猜测,100 次中有 100 次可能是错误的。您将获得所封装的任何业务逻辑的一致实现,但根据所需的数据量和逻辑,性能损失可能会很严重。

【讨论】:

  • 我担心是这样的。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2013-05-02
相关资源
最近更新 更多