列名とテーブル名の両方が渡されたときにクエリを実行するにはどうすればよいですか?
-
14-09-2019 - |
質問
一対の変数にテーブル名と列名が与えられた場合、動的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倍遅いため(プログラム可能なテーブル/列名をサポートしていないため、この質問)。
解決
動的バージョンは3倍遅くなります。これは、あなたがテーブル名の内外を交換することであり、パーサーはそのために最適化できないからです。
特にスキーマが頻繁に変更されない場合、それを使用して、それを使用して、事前に定義されたテーブル/列から選択ステートメントを選択するために使用することをお勧めします。それはより速く実行されるはずですが、あなたは真のダイナミックさを失います。
他のヒント
それで、ダイナミックSQLを使用せずに実行時にクエリを構築して実行できるかどうかという疑問があるように聞こえますか?
答えはノーだと思います。選択肢は次のとおりです。
- 動的SQL-呼び出し
sp_ExecuteSQL
またExec()
ユーザーが構築した文字列が与えられます。 ADOライブラリとコマンドオブジェクトを使用したパススルーSQLであるか、SPROC内にあるかどうか。 - コンパイルされたSQL-通常のオブジェクト(SPROCとUDF)を使用して、既知の良いオブジェクトと相互作用する既知の良いステートメントを使用します。この場合、解析は事前に行われます。
所属していません StackOverflow