1

変数のペアにテーブル名と列名が指定されている場合、動的 SQL を使用せずに選択クエリを実行できますか?

たとえば、これよりも優れたものが欲しいです。

CREATE PROCEDURE spTest (@table NVARCHAR(30), @column NVARCHAR(30)) AS

  DECLARE @sql NVARCHAR(2000) 
  SELECT @sql = N'SELECT ' + @column + N' FROM ' + @table
  PRINT @sql

  EXEC sp_executesql @sql

私の動的SQLバージョンは非動的バージョンよりも3倍遅いため、これを行いたいと思います(プログラム可能なテーブル/列名をサポートしていないため、この質問です)。

4

2 に答える 2

2

動的バージョンは 3 倍遅くなります。これは、テーブル名をスワップインおよびスワップアウトするためであり、パーサーはそれを最適化できません。

特にスキーマが頻繁に変更されない場合は、ルーチンで入れ子になった switch ステートメントを使用し、それを使用して事前定義されたテーブル/列から SELECT ステートメントを選択することができます。これははるかに高速に実行されるはずですが、真の動的性が失われます。

于 2009-06-15T21:15:22.860 に答える
1

質問は、動的 SQL を使用せずに実行時にクエリを作成して実行できるかどうかということのように思えます。

答えはノーだと思います。選択肢は次のとおりです。

  • 動的 SQL -ユーザーが作成した文字列を呼び出すsp_ExecuteSQLか指定します。Exec()それが ADO​​ ライブラリと Command オブジェクトを使用したパススルー SQL であるか、sproc 内であるかに関係なく。
  • コンパイルされた SQL - 通常のオブジェクト (sproc および UDF) を使用して、既知の正常なステートメントと対話します。この場合、解析は事前に行われます。
于 2009-06-15T21:13:43.033 に答える