2009-06-25 85 views
0

可能在SQL函数中将类型传递为参数?作为参数传递类型的SQL Server函数

提前致谢。

+0

你可以通过添加你想要实现的例子来澄清吗? – 2009-06-25 10:25:12

+0

它太糟糕了存储过程和函数没有像引用或argv和argc通过的东西.... – 2009-06-25 18:56:38

回答

1

的参数类型函数头中定义,因此它总是在函数中是相同的。当你传入一个与定义的类型参数类型不同的参数时,SQL Server会尽其所能为所定义的函数参数类型提供相应的参数。

我有一些功能,我想工作就像你以后一样。解决此问题的方法是将函数参数定义为varchar(x),然后在函数的传入参数中调用任何必需的CVONVERT()或格式时调用该参数。

CREATE FUNCTION dbo.QuoteValue 
(
    @InputStr  varchar(8000) --value to format 
) 
RETURNS 
varchar(8000) 
AS 
BEGIN 
    RETURN COALESCE(''''[email protected]+'''','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 @[email protected] 
     --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 @[email protected] 
     --do some int manipulation here 
     SET @[email protected] 
    END 
    ELSE IF @Type='F' --float 
    BEGIN 
     DECLARE @FloatValue float 
     SET @[email protected] 
     --do some float manipulation here 
     SET @[email protected] 
    END 
     ELSE IF @Type='D' --datetime 
    BEGIN 
     DECLARE @DatetimeValue datetime 
     SET @[email protected] 
     --do some datetime manipulation here 
     SET @ReturnValue=CONVERT(varchar(23),@DatetimeValue,121) 
    END 
    --etc... 
    --etc... 

    RETURN @ReturnValue 
END 
GO 

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

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

当然,你可以为你的函数参数定义一个类型 - 但我想这不是你真正想问什么,对吧?请澄清!

马克