Как я могу проанализировать динамический SQL перед выполнением в T-SQL? - PullRequest
5 голосов
/ 07 мая 2009

Мне нужно знать, как анализировать запрос, чтобы узнать, правильно ли он собран, перед его выполнением. Если синтаксический анализ выполнен правильно, выполните его, если не откажитесь.

Мне не удалось этого сделать с помощью SET NOEXEC, SET PARSEONLY, TRY / CATCH.

Я использую динамический sql внутри цикла. Иногда динамический sql неверен не по моей вине, а по информации, существующей в базе данных. По этой причине я хотел бы разобрать его перед выполнением.

Ответы [ 3 ]

7 голосов
/ 07 мая 2009

Это может быть возможно с некоторыми хитростями sp_executesql:

-- The query you would like to parse
declare @sql nvarchar(max)
set @sql = 'select 1'

declare @testsql nvarchar(max)
declare @result int
set @testsql = N'set parseonly on; ' + @sql
exec @result = sp_executesql @testsql

-- If it worked, execute it
if @result = 0
    begin
    exec sp_executesql @sql
    end

Если я использую неправильный запрос, например «salact 1», значение @result будет ненулевым.

TRY / CATCH не очень хорошо работает с sp_executesql, поэтому я проверяю возвращаемое значение.

3 голосов
/ 07 мая 2009

Чего ты пытаешься достичь?

Как указывалось ранее, T-SQL не будет компилироваться, если запрос не разбирается.

Если вы просто хотите иметь способ проверить, что запрос в порядке (например, чтобы убедиться, что вы не забыли оператор where или около того), то, возможно, showplan поможет вам

set showplan_xml on

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

3 голосов
/ 07 мая 2009

Попробуйте использовать SET FMTONLY ON и SET FMTONLY OFF.

SET PARSEONLY ON для вашего кода. SET PARSEONLY OFF должно работать для большинства.

MSDN FMTONLY

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