2012-05-11 11 views
3

SQLで動的な名前の関数を呼び出すことはできますか?例えばSQLで動的関数名を呼び出す

SELECT functionid, (SELECT results FROM dbo.Function_*functionid*) AS results 
FROM List_of_Functions 

これは、テーブルList_of_Functionsの各行に異なる関数を呼び出すことになります。

これはすべて間違っていますか?

答えて

3

あなたが好きなSQL文の(どちらかそれを入力するか、あなたのテーブルに基づいて動的に構築)を構築する必要があります。代わりに、すべてのこれらの機能を構築する

SELECT 
    functionid 
     ,CASE functionid 
      WHEN 1 THEN dbo.Function_1() 
      WHEN 2 THEN dbo.Function_2() 
      WHEN 3 THEN dbo.Function_3() 
     END AS results 
    FROM List_of_Functions 

を、それがより良いではないでしょう1つの関数を作成し、その関数が処理を区別するために使用できる値を渡しますか? like:

SELECT 
    functionid 
     ,dbo.Function(functionid) AS results 
    FROM List_of_Functions_Parameters 
+0

方法1と方法2のパフォーマンスに違いがあるかどうかは分かりますか? – William

+0

@ウィリアム、私はあなたがどれくらい多くの機能を持っているのか、実際に何をしているのか分かりません。したがって、パフォーマンスについて何かが完全な推測であると言っています。 –

2

SQLで動的な名前の関数を呼び出すことはできますか?

純粋なSQLではありません。

動的SQLを使用してこれを実現できますが、特にリスクはありません。具体的にはSQL Injectionです。

私は、被験者の包括的な治療について、Erland SommarskogによってThe Curse and Blessings of Dynamic SQLを読むことをお勧めします。

+0

しかし、私が投稿したクエリでは、関数名の動的部分はSQLの値から来ていて、ユーザーの入力ではないので何が注入できるのですか? – William

+0

@William - あなたの 'List_of_Functions'に不要なものが入ったら?私は_all_ケースではリスクだと言っているわけではありませんが、一般的に動的SQLを使用する場合は、このリスクを念頭に置く必要があります。 – Oded

+0

この場合、List_of_Functionsは私によって作成されるので問題はありません。したがって、これは純粋なSQLではまったく不可能ですか?私はこの問題に近づける他の方法を知っていますか? – William

関連する問題