Как программно проверить (проанализировать) действительность оператора TSQL? - PullRequest
49 голосов
/ 21 июня 2010

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

Ответы [ 7 ]

37 голосов
/ 21 июня 2010

Я думаю, что вы ищете команду SET NOEXEC ON. Если вы установите это для своего соединения, запросы будут проанализированы, но не будут выполнены. Другой вариант будет SET PARSEONLY ON, но я, честно говоря, не уверен, в чем разница между этими двумя.

21 голосов
/ 21 июня 2010

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

например

SELECT * FROM ATableThatDoesNotExist

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

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

8 голосов
/ 13 мая 2013

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;'
7 голосов
/ 21 июня 2010

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

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF
6 голосов
/ 21 июня 2010

На самом деле это зависит от цели испытаний.

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

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

6 голосов
/ 21 июня 2010

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

4 голосов
/ 21 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...