統合テストをよりべき等にしようとしています。 1つのアイデアは、すべてのテストの後にロールバックを実行することでした。もう1つのアイデアは、クエリアナライザーまたはSSMSの緑色のチェックボックスと同様に、プログラムでテキストを解析する方法でした。
ADO.NETを使用せずにSQLServerにコマンドを解析させるにはどうすればよいですか?
PDATE:これは最終的に希望どおりに機能したものです:
using (DbCommand executeOnly = Factory.DbCommand())
{
executeOnly.Connection = command.Connection;
executeOnly.CommandType = CommandType.Text;
executeOnly.CommandText = "SET NOEXEC ON;" + sqlCommand;
executeOnly.Connection.Open();
executeOnly.ExecuteNonQuery();
}
//set more properties of command.
command.Execute();
説明できない理由により、「SET PARSEONLY ON
」はクエリアナライザでのみ機能しました。 ADO.NET接続でこれを設定できませんでした。 PARSEONLY
は構文エラーのみをキャッチしているように見えるため、これも同様です。これは一般的なエラーではありません。 SET NOEXEC ON
は、欠落しているテーブルまたは列を参照するビューや、ストアドプロシージャ内の欠落しているパラメータなど、さまざまなエラーをキャッチします。
あなたが探しているコマンドは SET NOEXEC ON
。これを接続に設定すると、クエリは解析されますが、実行されません。別のオプションはSET PARSEONLY ON
ですが、正直なところ、この2つの違いが実際に何であるかはわかりません。
エリックの答えに+1。しかし、SET FMTONLY ON
はすべてのエラーをスローするようには見えないので、SET NOEXEC ON
も役立つことがわかりました。
例えば.
SELECT * FROM ATableThatDoesNotExist
これをSET NOEXEC ON
で実行すると、データベースにテーブルが存在しないにもかかわらず、成功したことがわかります。代わりにSET FMTONLY ON
を指定して実行すると、「無効なオブジェクト名」エラーがスローされます。
SET FMTONLY ON 返される結果セットに関するメタデータも返します。これは、非常に便利です。
SQL Server 2012は、次のシステムプロシージャと関数を使用して、構文、プロシージャ、およびテーブルを解析できます。
私はそれらをテストしました、そしてそれらは「SETNOEXECON」と「SETPARSEONLYON」よりずっとよく働きます
例:
エラーをスローしません:
sp_describe_undeclared_parameters
@tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;'
正しくエラーをスローします(「SETNOEXEC」と「SETPARSEONLY」はこの場合エラーをスローしません):
sp_describe_undeclared_parameters
@tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;SELECT object_id, name, type_desc FROM sys.NOTaTABLE;'
次のクエリを使用します
SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF
SET PARSEONLY :各Transact-SQLステートメントの構文を調べ、ステートメントをコンパイルまたは実行せずにエラーメッセージを返します。
本当にそれはテストの目的に依存します。
最も信頼できる方法は、ステートメントがそれに適している場合は、すべてのテストの後にロールバックを使用することです(実行可能にするのに重すぎない)。
私は過去にこれを行ったことがあり、他の方法では見つけられなかったランタイムの問題について通知を受けてうれしく思います。
VSTSDBProには、プログラムでアクセスできるクエリパーサーがあります。 http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx