【问题标题】:SQL 2005 - Variant Parameter QuestionSQL 2005 - 变体参数问题
【发布时间】:2011-09-01 14:52:30
【问题描述】:

我正在开发一个功能,该功能将被不少于 10 个 SProc 使用,并且在解决后可能会增长。

我遇到的问题是我不想为每个数据类型开发一个函数,这就是为什么SQL_VARIANT 数据类型看起来很方便的原因。我知道可以对数据类型进行ISNULL 检查,但我也想检查传递的值是否为有效数字,但ISNUMERIC 函数不适用于SQL_VARIANT,我也不是确定SQL_VARIANT_PROPERTY 函数。

到目前为止的代码:

CREATE FUNCTION dbo.mpt_Format_Number
(
    @value SQL_VARIANT
    , @money BIT
)
RETURNS VARCHAR
AS
BEGIN
    --Check for NULL value
    IF ISNULL(@value) BEGIN
        -- Value IS NULL, return NULL
        RETURN NULL
    END ELSE BEGIN
        -- Value is NOT NULL
        DECLARE @TMP VARCHAR
    END 
END

【问题讨论】:

  • 为了更容易阅读,我翻转了 ISNULL 检查,以免混淆任何人 ;)

标签: sql-server-2005 tsql sql-variant


【解决方案1】:
CREATE FUNCTION dbo.mpt_Format_Number 
( 
    @value SQL_VARIANT 
    , @money BIT 
) 
RETURNS VARCHAR 
AS 
BEGIN 
--Check for NULL value 
IF @value is null  
          -- Value IS NULL, return NULL 
    RETURN NULL 
ELSE 
BEGIN 
    -- Value is NOT NULL 
    if isnumeric(convert(varchar(max), @value)) = 1 RETURN 'Y' -- is valid number
    --DECLARE @TMP VARCHAR 

END  
return 'N' --is not valid number 
END 

您始终可以使用此语法测试属性类型。应该很容易配合你的功能。

declare @t SQL_VARIANT
set @t = '3'
select SQL_VARIANT_PROPERTY(@t, 'basetype') 

结果:

varchar

【讨论】:

  • cast 对我来说效果很好,cast 和 convert 通常可以用于相同的用途,唯一的区别是您可以向 convert 添加格式
  • @tclausen - SQL“编译器”一直在吐,说我需要使用 Convert 而不是 Cast
  • @GoldBishop 我看到了问题,我使用的是 2008,微软已经修复了这个错误。对于那个很抱歉。我改变了它。我希望现在一切正常
  • @tclausen - 一切都很好,我实际上建立在设计之上。我会将生成的函数发布给大家 ;)
【解决方案2】:

作为最终实现,这里是使用的完整功能。

ALTER FUNCTION [dbo].[_mpt_Format_Number]
(
    @value SQL_VARIANT
    , @money BIT = 0
)
RETURNS VARCHAR(max)
AS
BEGIN
    DECLARE @ret VARCHAR(MAX)
    --Check for NULL value
    IF @value IS NULL BEGIN
        -- Value IS NULL, return NULL
        SET @ret = 'NULL'
    END ELSE BEGIN
        -- Value is NOT NULL

        --Check for Numeric Value
        IF ISNUMERIC(CONVERT(VARCHAR, @value)) = 0 BEGIN
            --Value is NOT a Number, return NULL
            SET @ret =  'NULL'
        END ELSE BEGIN
            --Value IS a Number
            declare @isNeg BIT
            declare @tmp varchar(max)
            set @tmp = convert(varchar(max), round(cast(@value as money), 0), 1)

            --Check if value is negative
            if @value < 0 begin
                --Value is Negative
                set @isNeg = 1
                --Remove the negative sign
                set @tmp = replace(@tmp, '-', '')
            end 

            --Remove the decimal plus any digits to the right of the decimal
            set @tmp = left(@tmp ,len(@tmp) - 3)

            --Is money set to True
            if @money = 1 begin
                --Pre-pend the dollar sign to value
                set @tmp = '$' + @tmp
            end

            --Is isNeg set to True
            if @isNeg = 1 begin
                --Encapsulate the value with parenthesis
                set @tmp = '(' + @tmp + ')'
            end

            SET @ret =  @tmp
        END 
    END 

    RETURN @ret
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多