web-dev-qa-db-ja.com

C#を使用したクエリ検証

私はc#でクエリバリデーターを探しています。これにより、テキストボックスからSQLテキストを解析し、実行のために送信する前に正しいかどうかを確認できます。 (MS SQLまたはDB2クエリ)。

17
Cannon

データベースを使用せずにSQL構文を検証する場合は、 TSql100Parser クラスはこの状況でうまくいきます。

免責事項、この投稿から借用したコード SQLスクリプトを検証するコード

ただし、使用するのは非常に簡単です。 nullが返された場合は、解析中にエラーは発生していません。

using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;

public class SqlParser
{
        public List<string> Parse(string sql)
        {
            TSql100Parser parser = new TSql100Parser(false);
            IScriptFragment fragment;
            IList<ParseError> errors;
            fragment = parser.Parse(new StringReader(sql), out errors);
            if (errors != null && errors.Count > 0)
            {
                List<string> errorList = new List<string>();
                foreach (var error in errors)
                {
                    errorList.Add(error.Message);
                }
                return errorList;
            }
            return null;
        }
}
28
Feisty Mango

このヒントを使用して、クエリをsqlに設定します。

set PARSEONLY  on

クエリをチェックして、次のように返します。

set PARSEONLY  on
select * from tablea

例外を返しません。

一方

set PARSEONLY  on
select * f rom tablea

戻り値

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'f'.
8
DeveloperX

SELECTステートメントだけを検証/解析したい場合、そのselectステートメントがどれほど「ヘビーデューティー」であるかに関係なく、selectステートメントを検証するための最良かつ最速の方法は次のとおりです。-コードでcreate 2次のようなselectステートメント(文字列):

1)有効なselectステートメント:SELECT * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> 2)SELECT TOP 1 * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>>などの同様のselectステートメントを作成します-結合の数に関係なく、2番目のステートメントのみを解析/検証します。次のようなミリ秒:

SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn); 

try 
{
sqlConn.Open();
sqlParse.ExecuteNonQuery()
}

それが役に立てば幸い!乾杯!

1
Sergiu