使用泛型类型创建函数

时间:2014-02-12 13:34:05

标签: sql sql-server sql-server-2012

我在不同的地方使用这种语法,

CASE WHEN [dbo].[IsNullOrWhiteSpace](@MyColumn) = 1 OR [dbo].[IsNullOrWhiteSpace](Name) = 0 THEN [Name] ELSE @MyColumn END

唯一的变化是Name和@MyColumn。但MyColumn可以是任何类型。任何方式创建一个功能,使用genric类型执行此操作。这就是我所期待的,

ALTER FUNCTION [dbo].[GetParameterOrPreviousValue]
(
    @Value1 AnyType
    ,@Value2 AnyType
)
RETURNS AnyType
AS
BEGIN

    RETURN CASE WHEN [dbo].[IsNullOrWhiteSpace](@Value1) = 1 OR [dbo].[IsNullOrWhiteSpace](@Value2) = 0 THEN @Value2 ELSE @Value1 END;

END

请参阅AnyType。

更新

这是我的IsNullOrEmpty,

ALTER FUNCTION [dbo].[IsNullOrWhiteSpace]
                (
                    @Value nvarchar(MAX)
                )
                RETURNS bit
                AS
                BEGIN

                    RETURN CASE WHEN LTRIM(RTRIM(ISNULL(@Value,''))) = '' THEN 1 ELSE 0 END;

                END

我在UPDATE语句中使用它,

UPDATE T SET    [Name] = dbo.GetParameterOrPreviousValue(@Name, Name) 
                ,[Gender] = dbo.GetParameterOrPreviousValue(@Gender, Gender)
        ,[Location] = dbo.GetParameterOrPreviousValue(@Location, Location)
        ,[RawData] = dbo.GetParameterOrPreviousValue(@RawData, RawData)

2 个答案:

答案 0 :(得分:3)

我猜你可以使用sql_variant。还有[dbo].[IsNullOrWhiteSpace]呢?需要String类型吗?

答案 1 :(得分:2)

有“old-skool”sql_variant类型:

  

存储各种SQL Server支持的数据类型值的数据类型。

但请注意,大多数现代数据类型(例如varchar(max)geography等)都不受支持。


如果你想要做的只是忽略空参数值,你可以使用COALESCE

COALESCE(@Name,Name)

如果要忽略null和参数值,可以使用COALESCENULLIF

COALESCE(NULLIF(@Name,''),Name)

我一般都不愿意像对待NULL一样对待所有类型的空白。