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

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

49
задан MatthewMartin 15 June 2017 в 10:18
поделиться

6 ответов

Думаю, вам нужна команда SET NOEXEC ON . Если вы установите это для своего соединения, запросы будут анализироваться, но не выполняться. Другой вариант - УСТАНОВИТЬ ТОЛЬКО ДЛЯ , но я, честно говоря, не уверен, в чем разница между ними на самом деле.

37
ответ дан 7 November 2019 в 11:43
поделиться

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

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF
7
ответ дан 7 November 2019 в 11:43
поделиться

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

6
ответ дан 7 November 2019 в 11:43
поделиться

На самом деле это зависит от цели тестов.

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

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

6
ответ дан 7 November 2019 в 11:43
поделиться

+1 к ответу Эрика. Но я обнаружил, что SET FMTONLY ON также может быть полезен, поскольку SET NOEXEC ON не вызывает всех ошибок.

например.

SELECT * FROM ATableThatDoesNotExist

Выполнение этого с SET NOEXEC ON означает, что операция прошла успешно, несмотря на то, что таблица не существует в базе данных. Запуск его с SET FMTONLY ON вместо этого вызовет ошибку «Недопустимое имя объекта».

SET FMTONLY ON также возвращает метаданные о наборе результатов, который должен быть возвращен, что может оказаться очень полезным

21
ответ дан 7 November 2019 в 11:43
поделиться

VSTSDBPro имеет синтаксический анализатор запросов, к которому можно получить доступ программно: http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx

4
ответ дан 7 November 2019 в 11:43
поделиться