1

私が Web への移植に取り組んでいるアプリケーションでは、現在、指定された「テンプレート」文字列に基づいて、実行時にさまざまなテーブルに動的にアクセスしています。SQL サーバーに移行するので、その負担をデータベースに戻したいので、動的 GridView をいじる必要はありません。テーブル名のパラメーターとクエリの WHERE 句のパラメーターを使用して、テーブル値の UDF を作成することを考えました。

UDF に次のように入力しましたが、明らかに機能しません。ある種の varchar または文字列を取り、FROM 句で機能するテーブル参照を取得する方法はありますか?

CREATE FUNCTION TemplateSelector 
(   
@template varchar(40),
@code varchar(80)
)
RETURNS TABLE 
AS
RETURN 
(
SELECT * FROM @template WHERE ProductionCode = @code
)

または、これと概念が似ている結果セットを取得する他の方法。基本的に、@code の ProductionCode が一致する varchar @template によって示されるテーブル内のすべてのレコード。

「テーブル変数 "@template" を宣言する必要があります」というエラーが表示されるため、SQL サーバーはテーブル変数から選択しようとしている可能性があります。

編集時: ええ、関数でそれを行う必要はありません。Stored Procs を実行できます。以前にそれらを作成したことがありません。

4

6 に答える 6

4
CREATE PROCEDURE TemplateSelector 
(   
    @template varchar(40),
    @code varchar(80)
)

AS
EXEC('SELECT * FROM ' + @template + ' WHERE ProductionCode = ' + @code)

UDF ではありませんが、これは機能します。

于 2008-12-08T16:37:23.903 に答える
2

これを行う唯一の方法は、exec コマンドを使用することです。

また、関数ではなくストアド プロシージャに移動する必要があります。どうやら関数は動的SQLを実行できません。

于 2008-12-08T16:36:56.137 に答える
0

また、クエリのテーブル名を置き換えると、クエリの実行プランをキャッシュする SQL Server の機能が失われることに注意してください。これにより、UDFまたはSPを使用する利点がほとんどなくなります。SQL クエリを直接呼び出すこともできます。

于 2008-12-08T17:14:57.010 に答える
0

同じ構造のテーブルが多数ある場合は、通常、データベースを通常の形式で設計していないことを意味します。これらを 1 つのテーブルに統合する必要があります。データ セットを区別するために、このテーブルにもう 1 つの属性列を指定する必要がある場合があります。

于 2008-12-08T17:59:08.683 に答える
0

これを可能にする唯一の方法は動的 SQL を使用することですが、動的 SQL は関数内の SqlServer ではサポートされていません。

申し訳ありませんが、関数内でこれを行うことは不可能であると確信しています。

ストアド プロシージャを使用している場合は可能です。

于 2008-12-08T16:43:30.490 に答える
0

対処できるようにしたいテーブルの数が限られているので、IF を使用して、@template をいくつかの値との一致と各一致の実行についてテストする何かを書くことができます。

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code

それはより良いオプションのように聞こえます

于 2008-12-08T17:33:24.133 に答える