Я пытаюсь сделать свои интеграционные тесты большим количеством идемпотента. Одна идея состояла в том, чтобы выполнить откат после того, как каждый тест, другая идея была некоторым, как программно анализируют текст, подобный зеленому флажку в Query Analyzer или SSMS.
Как я заставляю SQL Server анализировать мою команду, не выполняя его с помощью ADO.NET?
ОБНОВЛЕНИЕ: Это - то, что наконец работало, как желаемый:
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
поймает более широкие варианты ошибок, такие как представление что ссылки недостающая таблица или столбец или недостающий параметр в хранимой процедуре.
Думаю, вам нужна команда SET NOEXEC ON
. Если вы установите это для своего соединения, запросы будут анализироваться, но не выполняться. Другой вариант - УСТАНОВИТЬ ТОЛЬКО ДЛЯ
, но я, честно говоря, не уверен, в чем разница между ними на самом деле.
Используйте следующий запрос
SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF
SET PARSEONLY : проверяет синтаксис каждого Оператор Transact-SQL и возвращает любые сообщения об ошибках без компиляции или выполнения оператора.
На самом деле это зависит от цели тестов.
Самым надежным способом было бы использовать откат после каждого теста, если ваши утверждения подходят для этого (не слишком тяжелый, чтобы сделать его жизнеспособным).
Я делал это раньше и был рад получить уведомление о проблемах во время выполнения, которые я бы не обнаружил никаким другим способом.
+1 к ответу Эрика. Но я обнаружил, что SET FMTONLY ON
также может быть полезен, поскольку SET NOEXEC ON
не вызывает всех ошибок.
например.
SELECT * FROM ATableThatDoesNotExist
Выполнение этого с SET NOEXEC ON
означает, что операция прошла успешно, несмотря на то, что таблица не существует в базе данных. Запуск его с SET FMTONLY ON
вместо этого вызовет ошибку «Недопустимое имя объекта».
SET FMTONLY ON также возвращает метаданные о наборе результатов, который должен быть возвращен, что может оказаться очень полезным
VSTSDBPro имеет синтаксический анализатор запросов, к которому можно получить доступ программно: http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx