web-dev-qa-db-ja.com

SQLステートメントの有効性をプログラムでチェック(解析)するにはどうすればよいですか?

統合テストをよりべき等にしようとしています。 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は、欠落しているテーブルまたは列を参照するビューや、ストアドプロシージャ内の欠落しているパラメータなど、さまざまなエラーをキャッチします。

50
MatthewMartin

あなたが探しているコマンドは SET NOEXEC ON 。これを接続に設定すると、クエリは解析されますが、実行されません。別のオプションはSET PARSEONLY ONですが、正直なところ、この2つの違いが実際に何であるかはわかりません。

37
Eric Petroelje

エリックの答えに+1。しかし、SET FMTONLY ONはすべてのエラーをスローするようには見えないので、SET NOEXEC ONも役立つことがわかりました。

例えば.

SELECT * FROM ATableThatDoesNotExist

これをSET NOEXEC ONで実行すると、データベースにテーブルが存在しないにもかかわらず、成功したことがわかります。代わりにSET FMTONLY ONを指定して実行すると、「無効なオブジェクト名」エラーがスローされます。

SET FMTONLY ON 返される結果セットに関するメタデータも返します。これは、非常に便利です。

21
AdaTheDev

SQL Server 2012は、次のシステムプロシージャと関数を使用して、構文、プロシージャ、およびテーブルを解析できます。

おそらく「SETFMTONLY」を置き換えています。

私はそれらをテストしました、そしてそれらは「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;'
8

次のクエリを使用します

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF
7
Ralf de Kleine

SET PARSEONLY :各Transact-SQLステートメントの構文を調べ、ステートメントをコンパイルまたは実行せずにエラーメッセージを返します。

6
Pranay Rana

本当にそれはテストの目的に依存します。

最も信頼できる方法は、ステートメントがそれに適している場合は、すべてのテストの後にロールバックを使用することです(実行可能にするのに重すぎない)。

私は過去にこれを行ったことがあり、他の方法では見つけられなかったランタイムの問題について通知を受けてうれしく思います。

6
Martin Smith

VSTSDBProには、プログラムでアクセスできるクエリパーサーがあります。 http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx

4
Robert L Davis