Sql server 2005 SQL 2005-变量参数问题
我正在开发一个功能,该功能将被不少于10个存储过程使用,并且在完成后可能会增长 我遇到的问题是,我不想为每种数据类型开发一个函数,这就是为什么SQL_变量数据类型看起来非常方便操作的原因。我知道is可以对数据类型执行ISNULL检查,但我还想检查传递的值是否为有效数字,但ISNUMERIC函数不适用于SQL\u VARIANT,我对SQL\u VARIANT\u属性函数也不太确定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
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的结果函数;