具有标量值函数的可变长度 NVARCHAR

Posted

技术标签:

【中文标题】具有标量值函数的可变长度 NVARCHAR【英文标题】:Variable Length NVARCHAR with Scalar-valued Function 【发布时间】:2013-03-22 22:10:30 【问题描述】:

是否可以使用 SQL Server 2012 创建一个返回可变长度 nvarchar 的标量值函数?当我说可变长度时,我希望函数接受任意长度的 nvarchar 并返回相同长度的 nvarchar

我正在尝试创建一个辅助函数,在将 nvarchar 列放入我们的数据仓库之前使用视图清理它们。我很确定这是不可能的,如果我错了,请纠正我。

我当前的功能(显然由于截断等原因无法正常工作):

create function dbo.fnClean (@input nvarchar)
returns nvarchar as
begin
    declare @return nvarchar

    set @return = ltrim(rtrim(@input))

    return @return
end

【问题讨论】:

【参考方案1】:

不,这是不可能的(并且您需要动态 SQL 来创建列或在另一侧以这种方式进行转换)。但是,如果您事先知道长度是多少,那么您可以单独跟踪它而不是依赖函数。或者使用返回 @input AND LEN(@input) 的表值函数。

最后,如果这就是这个函数的全部功能,那将会非常昂贵。通过将LTRIM(RTRIM()) 应用于输入而无需创建或引用函数,您从中获得了什么?标量函数对性能来说并不是很好。

【讨论】:

感谢您确认我的怀疑并让我了解性能注意事项和潜在解决方案。我只是对我正在使用的每个视图中的逻辑进行硬编码。【参考方案2】:

这行不通,尽管我会质疑目标 nvarchar 或 varchar 是否已经占用了变量空间...我已经在 ETL 中编写了脚本来计算最大数据类型并缩放列结果。但是,这是如果您对数据类型和空间非常谨慎(特别是十进制并且没有企业奢侈)。你的目标是什么?

【讨论】:

目标是在将列加载到我们的数据仓库之前隔离和集中清理列所需的逻辑。由于我在 20 多个视图中使用相同或相似的逻辑,我认为将其放入函数中是有意义的。我只是要对其进行硬编码。谢谢!

以上是关于具有标量值函数的可变长度 NVARCHAR的主要内容,如果未能解决你的问题,请参考以下文章

具有嵌套 CASES 的 Sql 标量值函数

从C中的函数返回具有多个可变长度数组的结构

如何读取值为可变长度 char* 数组的 HDF5 标量属性(即 c_strings?)

为啥 SQL Server 标量值函数变慢?

SQL 标量值函数

从标量值函数返回变量