SQL Server函数将类型作为参数传递

时间:2009-06-25 10:23:49

标签: sql-server tsql

可以在SQL函数中将类型作为param传递吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

参数类型在函数头中定义,因此在函数内始终相同。传入与定义的类型参数类型不同的参数时,SQL Server会尽力使用已定义的函数参数类型。

我有一些我想要工作的功能,就像你所追求的那样。我解决这个问题的方法是将函数参数定义为varchar(x),然后在函数调用参数时对函数中的传入参数发出任何必要的CVONVERT()或格式。

CREATE FUNCTION dbo.QuoteValue
(
     @InputStr      varchar(8000)  --value to format
)
RETURNS
varchar(8000)
AS
BEGIN
    RETURN COALESCE(''''+@InputStr+'''','null')
END
GO

DECLARE @DateValue  datetime
SET @DateValue=GETDATE()
PRINT '@DateValue='+dbo.QuoteValue(@DateValue)
PRINT '@DateValue='+dbo.QuoteValue(CONVERT(varchar,@DateValue,121))

根据您的目标,如果您想使用日期或数字,请使用函数参数varchar(x)并在函数中使用:

  • ISDATE(表达式) - 如果输入表达式是有效日期,则ISDATE返回1;否则,它返回0.下表显示了一系列示例的返回值。
  • ISNUMERIC(Transact-SQL) - 当输入表达式求值为有效整数,浮点数,货币或小数类型时,ISNUMERIC返回1;否则返回0.返回值1表示表达式可以转换为至少一种数字类型。

这是一个如何处理日期的例子......

CREATE FUNCTION dbo.DateXYZ
(
     @InputStr      varchar(50)  --date value manipulate
)
RETURNS
datetime
AS
BEGIN
    DECLARE @DateValue  datetime

    IF ISDATE(@InputStr)=1
    BEGIN
        SET @DateValue=@InputStr
        --do some datetime manipulation here
    END  
    RETURN @DateValue --will return null if not given a valid date
END
GO

您可以按如下方式使用它:

DECLARE @X varchar(50)
DECLARE @Y varchar(50)
DECLARE @BadDate datetime
DECLARE @GoodDate datetime
SET @X='bad date!!'
SET @Y='1/1/2009'
SET @BadDate=dbo.DateXYZ(@X)
SET @GoodDate=dbo.DateXYZ(@Y)
SELECT @BadDate,@GoodDate

你也可以传入一个参数来表示你传入的内容:

CREATE FUNCTION dbo.AnyType
(
     @InputStr      varchar(8000)  --general purpose value
    ,@Type          char(1)         --"I"nt, "F"loat, "D"atetime, "S"tring, etc...
)
RETURNS
varchar(8000)
AS
BEGIN
    DECLARE @ReturnValue  varchar(8000)

    IF @Type='I' --int
    BEGIN
        DECLARE @IntValue int
        SET @IntValue=@InputStr
        --do some int manipulation here
        SET @ReturnValue=@IntValue
    END  
    ELSE IF @Type='F' --float
    BEGIN
        DECLARE @FloatValue float
        SET @FloatValue=@InputStr
        --do some float manipulation here
        SET @ReturnValue=@FloatValue
    END  
       ELSE IF @Type='D' --datetime
    BEGIN
        DECLARE @DatetimeValue  datetime
        SET @DatetimeValue=@InputStr
        --do some datetime manipulation here
        SET @ReturnValue=CONVERT(varchar(23),@DatetimeValue,121)
    END   
    --etc...
    --etc...

    RETURN @ReturnValue
END
GO

函数只返回一个固定类型,使其成为varchar(x)并让调用者将其分配给正确数据类型的变量,或者根据需要在结果集中将其CAST。

答案 1 :(得分:0)

CREATE FUNCTION 
  dbo.MyFunction(@Param1 VARCHAR(50), @Param2 INT, @Param3 UNIQUEIDENTIFIER)
RETURNS
  INT

当然你可以为你的函数参数定义一个类型 - 但我想这不是你的要求,对吗?请澄清!

马克