2011-02-05 15 views
0
create function test 
(
    @tblName as sysname, 
    @category as varchar(50) 
) 
returns int 
as 
begin 
    declare @val2 as int 
    select @val2=val1 from @tblName where [email protected] 
    return @val2 
end 

いただきましたこのクエリと間違って、それは次のようなエラーUD scaller関数のパラメータとしてテーブル名を渡す方法は?

メッセージ1087、レベル15、状態2、プロシージャのテストを投げ、11行目
は、テーブル変数を宣言しなければなりません "@tblName"。 tblName1 @

答えて

1

あなたはテーブル名をparameteriseことができないで@tblNameとしてdecalredされます。動的SQLを使用する必要があります(これは関数では許可されていません)。

UNION ALLは、テーブルの固定リストと、何をしようとしているかを決める定数を使用することができます。あなたが投稿したコードはほとんど意味 (あなたはテーブルが@tblNameの値がval1列?!でこれと同じ値が含まれて呼び出された場合@val2@tblNameと同じ値を持つようにしたい)が、

;WITH cte AS 
(
SELECT 'table1' AS table_name, val1 
FROM table1 
UNION ALL 
SELECT 'table2' AS table_name, val1 
FROM table2 
) 
select @val2=val1 from cte where [email protected] and val1 = @tblName 
+0

のようなものになります。しかし、私上記のクエリはハードコーディングされた値の関数を作ることを私に示唆しています。私の要件は全く異なります。関数はすべてのテーブル名をパラメータとして呼び出さなければなりません。 – NoviceToDotNet

+0

@Novice - 関数では不可能な動的SQLが必要です。とにかくこのタイプのテクニックは、SQL Serverでは決して良いアイデアではなく、おそらく悪いデザインを示しています。あなたが照会したいテーブルを事前に知っているのはなぜですか? 'val1'カラムを持つこれらのテーブルは全く別であるべきですか? –

+0

あなたは本当ですが、私は自分の学習のためにそれを作っていました...まあありがとうございます。しかし、このような必要が生まれるかもしれない状況が起こると思いませんか? – NoviceToDotNet

1

は、関数のパラメータ

関連する問題