Как я могу программно проверить (проанализировать) правильность выражения TSQL? - программирование
Подтвердить что ты не робот

Как я могу программно проверить (проанализировать) правильность выражения TSQL?

Я пытаюсь сделать мои интеграционные тесты более идемпотентными. Одна из идей заключалась в том, чтобы выполнить откат после каждого теста, другая идея заключалась в том, как программный синтаксический анализ текста аналогичен зеленому флажку в Query Analyzer или SSMS.

Как мне заставить SQL Server анализировать мою команду без ее использования с помощью ADO.NET?

UPDATE: Это то, что наконец-то сработало по желанию:

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" работал только в Query Analyzer. Я не мог установить это на соединение ADO.NET. Это также хорошо, потому что PARSEONLY, кажется, улавливает только синтаксические ошибки, что не является общей ошибкой. SET NOEXEC ON будет охватывать более широкие варианты ошибок, например представление, которое ссылается на отсутствующую таблицу или столбец или отсутствующий параметр в хранимой процедуре.

4b9b3361

Ответ 1

Я думаю, что команда, которую вы ищете, 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 также возвращает метаданные о возвращаемом наборе результатов, который может оказаться очень удобным

Ответ 3

SQL Server 2012 может анализировать ваш синтаксис, процедуры и таблицы со следующими системными процедурами и функциями:

Они якобы заменяют "SET FMTONLY" .

Я тестировал их, и они работают намного лучше, чем "SET NOEXEC ON" и "SET PARSEONLY ON"

Примеры:

Не будет ошибка:

sp_describe_undeclared_parameters
    @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;'

Правильно выбросит ошибку ( "SET NOEXEC" и "SET PARSEONLY" в этом случае не выдают ошибку):

sp_describe_undeclared_parameters 
  @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;SELECT object_id, name, type_desc FROM sys.NOTaTABLE;'

Ответ 4

Используйте следующий запрос

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF

Ответ 5

SET PARSEONLY: рассматривает синтаксис каждого оператора Transact-SQL и возвращает любые сообщения об ошибках без компиляции или выполнения инструкции.

Ответ 6

Действительно, это зависит от цели тестов.

Самый надежный способ - использовать откат после каждого теста, если ваши заявления поддаются этому (не слишком тяжелый вес, чтобы сделать его жизнеспособным).

Я сделал это в прошлом и был рад получить уведомление о проблемах во время выполнения, которые я бы не поймал иначе.