Sql server 2005 SQL 2005-变量参数问题

Sql server 2005 SQL 2005-变量参数问题,sql-server-2005,tsql,sql-variant,Sql Server 2005,Tsql,Sql Variant,我正在开发一个功能,该功能将被不少于10个存储过程使用,并且在完成后可能会增长 我遇到的问题是,我不想为每种数据类型开发一个函数,这就是为什么SQL_变量数据类型看起来非常方便操作的原因。我知道is可以对数据类型执行ISNULL检查,但我还想检查传递的值是否为有效数字,但ISNUMERIC函数不适用于SQL\u VARIANT,我对SQL\u VARIANT\u属性函数也不太确定 declare @t SQL_VARIANT set @t = '3' select SQL_VARIANT_PRO

我正在开发一个功能,该功能将被不少于10个存储过程使用,并且在完成后可能会增长

我遇到的问题是,我不想为每种数据类型开发一个函数,这就是为什么SQL_变量数据类型看起来非常方便操作的原因。我知道is可以对数据类型执行ISNULL检查,但我还想检查传递的值是否为有效数字,但ISNUMERIC函数不适用于SQL\u VARIANT,我对SQL\u VARIANT\u属性函数也不太确定

declare @t SQL_VARIANT
set @t = '3'
select SQL_VARIANT_PROPERTY(@t, 'basetype') 
迄今为止的代码:

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
您始终可以使用此语法测试属性类型。在您的功能中应该易于操作

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

varchar
您始终可以使用此语法测试属性类型。在您的功能中应该易于操作

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

varchar

作为最后的实现,这里是使用的全部功能

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

作为最后的实现,这里是使用的全部功能

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

为了便于阅读,我翻转了ISNULL检查,以免混淆任何人;为了便于阅读,我翻转了ISNULL检查,以免混淆任何人;cast对我来说工作得很好,cast和convert通常可以用于相同的目的,唯一的区别是可以向convert@tclausen-SQL编译器一直在吐,说我需要使用Convert而不是Cast@GoldBishop我看到了问题所在,我使用的是2008年,微软已经修复了这个漏洞。很抱歉。我改了。我希望一切顺利now@tclausen-一切都很好,我实际上是在设计的基础上建立起来的。我将发布yall到brow beat的结果函数;cast对我来说工作得很好,cast和convert通常可以用于相同的目的,唯一的区别是可以向convert@tclausen-SQL编译器一直在吐,说我需要使用Convert而不是Cast@GoldBishop我看到了问题所在,我使用的是2008年,微软已经修复了这个漏洞。很抱歉。我改了。我希望一切顺利now@tclausen-一切都很好,我实际上是在设计的基础上建立起来的。我将发布yall到brow beat的结果函数;