Как я могу программно проверить (проанализировать) правильность выражения 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
будет охватывать более широкие варианты ошибок, например представление, которое ссылается на отсутствующую таблицу или столбец или отсутствующий параметр в хранимой процедуре.
Ответы
Ответ 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
Действительно, это зависит от цели тестов.
Самый надежный способ - использовать откат после каждого теста, если ваши заявления поддаются этому (не слишком тяжелый вес, чтобы сделать его жизнеспособным).
Я сделал это в прошлом и был рад получить уведомление о проблемах во время выполнения, которые я бы не поймал иначе.
Ответ 7
VSTSDBPro имеет анализатор запросов, к которому вы можете обращаться программно: http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx