2009-06-25 11 views
0

SQL関数で型をparamとして渡すことはできますか?タイプをパラメータとして渡すSQL Server関数

ありがとうございます。

+0

達成したいことの例を追加して明確にできますか? –

+0

それはあまりにもストアドプロシージャが悪いですし、関数は参照渡しやargvとargcのようなものを持っていません.... –

答えて

1

パラメータタイプは、それが常に関数内で同じである結果として、機能ヘッダ内で定義されています。定義された型のパラメータ型とは異なる型のパラメータを渡すと、SQL Serverは定義済みの型のパラメータ型に最も適しています。

私はあなたの後ろのように働きたいいくつかの機能を持っています。私がこの問題を回避する方法は、varchar(x)として関数パラメータを定義し、必要なCVONVERT()を発行するか、関数の呼び出し時にパラメータを呼び出す際に入力パラメータに対して書式を設定することです。

  • ISDATE(式):あなたは、日付や数値で動作する関数の引数はvarchar(X)を作りたい場合は、後にされている内容に応じて、関数の使用中

    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)) 
    

    - 入力式が有効な日付であればISDATEは1を返します。それ以外の場合は0を返します。次の表は、選択した例の戻り値を示しています。

  • ISNUMERIC(Transact-SQL) - ISNUMERICは、入力式が有効な整数、浮動小数点数、金額または小数点の型に評価されたときに1を返します。それ以外の場合は0が返されます。戻り値1は、expressionが少なくとも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 

確かに、あなたの関数のパラメータの型を定義することができますが、実際にあなたの質問には当てはまりませんよね?どうか明らかにしてください!

マルク

+0

安全にキャストする機能が必要です。それは "変換"機能と同じですが、例外をスローすることはありません。 – AndrewG

+0

だから、 "変換"関数と同じ型を渡す必要があります。 myconvert(float、data、defaultvalue) – AndrewG

+0

私はこれを単一のT-SQL関数で行うことはできないと思います。 "SafeDecimalConvert"、 "SafeIntConvert"などT-SQLには.NETのような "Type"という概念はありません。 –

関連する問題