4

API を介して n パラメータとしてクエリを受け取る SQL テーブル値関数を作成したいと考えています。私の関数では、そのクエリを実行したいと思います。クエリは SELECT ステートメントになります。

これは私がこれまでに行ったことであり、達成すべきことですが、正しい方法ではありません。

CREATE FUNCTION CUSTOM_EXPORT_RESULTS ( 
    @query varchar(max),
    @guid uniqueidentifier,
    @tableName varchar(200))
RETURNS TABLE 
AS
RETURN 
(
    -- Execute query into a table
    SELECT * 
    INTO @tableName
    FROM (
        EXEC(@query)
    ) 
)
GO

正しい方法を教えてください!

4

3 に答える 3

3

あなたの質問で私が見ているのは、次のカプセル化です。

  • 動的 SQL 式の取得
  • パラメータ化されたテーブルを埋めるためにそれを実行する

なぜそのようなカプセル化をしたいのですか?

まず、これはデータベースのパフォーマンスに悪影響を及ぼす可能性があります。EXEC() および sp_executesql() でこれを読んでください。アプリケーションの複数の部分から SP が呼び出されないことを願っています。これにより、少なくともパフォーマンスに関して問題が発生するためです。

もう 1 つは、SQL をどのように、どこで構築しているのかということです。明らかに、あなたはそれを別の場所で行い、手動で作成されたようです。現代のアプリケーションについて話している場合、これには多くの OR/M ソリューションがあり、実行時に TSQL を手動で構築することは、可能であれば常に避ける必要があります。言うまでもなく、EXEC はあらゆる形式の SQL インジェクション攻撃からユーザーを保護していません。ただし、これらすべてが何らかのデータベース管理 TSQL バンドルの一部である場合は、彼の段落は忘れてください。

最後に、TSQL の管理タスクの一部として、既存のテーブル (またはその一部) から新しいテーブルを単純にロードする場合は、SELECT ... INTO ... を発行することを検討してください。これにより、新しいターゲットが作成されます。テーブル構造を作成し (インデックスと制約を省略)、データをコピーします。SELECT INTOは最小限のログしか記録されないため、SELECT INTO は INSERT INTO SELECT よりもパフォーマンスが優れています。

これにより、あなた(および他の人)が少なくとも少しは正しい方向に進むことを願っています.

于 2013-07-19T08:16:22.373 に答える
-5

ストアドプロシージャも使用できます。試すことができるコードは次のとおりです。

CREATE FUNCTION CUSTOM_EXPORT_RESULTS 
(   
    @query varchar(max),
    @guid uniqueidentifier,
    @tableName varchar(200)
)
RETURNS TABLE 
AS
RETURN 
(
    declare @strQuery nvarchar(max)
    -- Execute query into a table
    SET @strQuery = REPLACE(@query,'FROM', 'INTO '+@tableName+' FROM')
    exec sp_executesql @strQuery
)
GO
于 2013-07-19T07:44:16.177 に答える