Способы проверки запросов T-SQL?

#sql #sql-server #tsql

#sql #sql-сервер #tsql #синтаксис

Вопрос:

У меня есть доступ к базе данных Access, и в этой базе данных есть поля, заполненные запросами TSQL. Эти запросы обрабатываются T-SQL на сервере. Поэтому, когда я пишу эти SQL-запросы и помещаю их в поле для использования конечным сервером, я не могу проверить синтаксис / etc . Я мог бы создать временный запрос в этой базе данных Access, но это не тот же язык запросов. Например, Access будет правильно использовать IIF , но TSQL не будет (вместо этого будет CASE ).

У меня нет прямого доступа к этому серверу с помощью TSQL, есть ли способ проверить мои запросы T-SQL (для синтаксиса и тому подобного)? Возможно, веб-инструмент онлайн?

Я должен отметить, что у меня нет доступа к SQL server. Только Access db и только. Я понимаю, что он не будет проверять имена таблиц и тому подобное, я бы этого не ожидал.

Комментарии:

1. Это было бы сложно, особенно если вы проверяете свои запросы, относящиеся к объектам на сервере SQL.

Ответ №1:

На самом деле, комбинация ответа MattMc3 и ответа FremenFreedom должна работать.

Загрузите SQL Express.

Затем объявите следующую хранимую процедуру:

 create procedure IsValidSQL (@sql varchar(max)) as
begin
    begin try
        set @sql = 'set parseonly on;' @sql;
        exec(@sql);
    end try
    begin catch
        return(1);
    end catch;
    return(0);
end; -- IsValidSQL
 

Вы можете протестировать его с помощью:

 declare @retval int;
exec @retval = IsValidSQL 'select iif(val, 0, 1) from t';
select @retval
 

или с:

 declare @retval int;
exec @retval = IsValidSQL 'select val from t';
select @retval
 

Примечание: это приведет к проблеме с IIF(). Он не будет перехватывать ничего, связанного со структурами таблиц или структурами столбцов. Для этого вам понадобится схема и немного другой подход («select top 0 * from () t») woudl сделать это.

Возможно, вы сможете что-то сделать с SQL Fiddle онлайн. Тем не менее, я бы предложил иметь локальную копию базы данных.

Ответ №2:

Вы можете проанализировать свой T-SQL для проверки правильности синтаксиса, выполнив его на компьютере SQL Server с a SET PARSEONLY ON в качестве первой строки вашего скрипта. Он не будет проверять имена таблиц или полей, но предоставит вам любые синтаксические ошибки.

Комментарии:

1. Это правильно, хотя ограничение невозможности подключения к базе данных SQL Server не было конкретно указано в вопросе. Из-за отсутствия проверки таблиц / столбцов ничто не мешает подключению к установке SQL Express. Не обязательно должна быть рабочей базой данных.

2. У меня нет доступа к компьютеру SQL Server. Access — единственное приложение, к которому я могу прикоснуться (через Citrix).

Ответ №3:

Специалист по обработке данных (Герт Дрейперс) описывает, как использовать встроенный анализатор SQL Server T-SQL в вашем приложении здесь:

Если вы хотите проверять только правильность имеющихся у вас инструкций SQL, это может быть хорошим решением, и для этого не требуется устанавливать SQL Server как таковой там, где вы запускаете свои модульные тесты.

Это подход, основанный на .NET, и он, конечно, не может проверять имена объектов в вашей базе данных, если вы не используете действующую базу данных, но он может обнаруживать синтаксические ошибки в ваших операторах T-SQL.

Ответ №4:

Вы можете использовать NOEXEC опцию:

 SET NOEXEC ON

SELECT 1 AS Test

SET NOEXEC OFF
 

Комментарии:

1. Для моих нужд SET NOEXEC ON намного превосходит SET PARSEONLY ON , поскольку этот параметр также проверяет запрос на соответствие схеме.

Ответ №5:

Может ли SQL Server Management Studio Express (скачать бесплатно) подключаться к обычным экземплярам SQL Server? Если да, возможно, вы могли бы протестировать запросы там. Даже если вам не удалось подключиться к реальному серверу, вы можете создать тестовую версию своей базы данных в Express, которая, по крайней мере, позволит вам выявить проблемы с синтаксисом и именами.

Ответ №6:

Если они достаточно статичны, преобразуйте их в хранимые процедуры в базе данных Sql, а затем просто вызывайте их из access.