Проверка запроса с использованием С#

Я ищу валидатор запросов в С#, который позволяет мне анализировать текст SQL из текстового поля и проверять его правильность или нет, прежде чем отправлять его на исполнение. (Запросы MS SQL или DB2).

Ответы

Ответ 1

Если вы хотите проверить синтаксис 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;
        }
}

Ответ 2

задайте свой запрос в sql с помощью этого подсказки

установить PARSEONLY on он просто проверяет ваш запрос и возвращает

как это

установить PARSEONLY on выберите * from tablea

не возвращает исключение

и

установить PARSEONLY on выберите * f rom tablea

возвращает

Msg 102, уровень 15, состояние 1, строка 2 Неверный синтаксис рядом с 'f'.

Ответ 3

Если вы хотите проверить или проанализировать только инструкцию SELECT, независимо от того, насколько "сверхпрочный" этот оператор select, я обнаружил, что лучший и быстрый способ проверки утверждения select заключается в следующем: - в вашем коде создайте 2 оператора выбора (строки), такие как:

1) Ваш действительный оператор выбора: SELECT * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> 2) Создайте аналогичный оператор select, например SELECT TOP 1 * FROM HUGE_TABLE JOIN MULTIPLE_TABLES WHERE <<Condition>> - Parse/Validate только второй, независимо от того, сколько соединений у вас там, он будет анализировать его в миллисекундах, например:

SqlCommand sqlParse = new SqlCommand(ParseSelectStatement, sqlConn); 

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

Надеюсь, это поможет! Ура!