在执行之前,我需要知道如何解析查询以了解它是否构建良好。如果解析正确则执行它,如果不正确则丢弃它。
我无法使用 SET NOEXEC、SET PARSEONLY、TRY/CATCH 来完成此操作。
我在循环中使用动态 sql 。有时动态sql不正确不是因为我的错,而是因为数据库中存在的信息。出于这个原因,我想在执行之前对其进行解析。
在执行之前,我需要知道如何解析查询以了解它是否构建良好。如果解析正确则执行它,如果不正确则丢弃它。
我无法使用 SET NOEXEC、SET PARSEONLY、TRY/CATCH 来完成此操作。
我在循环中使用动态 sql 。有时动态sql不正确不是因为我的错,而是因为数据库中存在的信息。出于这个原因,我想在执行之前对其进行解析。
这可能通过一些 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 一起使用,所以我改为检查返回值。
尝试使用 SET FMTONLY ON 和 SET FMTONLY OFF。
SET PARSEONLY ON 你的代码 SET PARSEONLY OFF 应该适用于大多数人。
你想达到什么目的?
如前所述,除非查询是可解析的,否则 T-SQL 不会编译。
如果您只是想有一种方法来验证查询是否正常(例如,验证您没有忘记 where 语句左右),那么 showplan 可能会对您有所帮助
set showplan_xml on
这将告诉 sql server 只解析查询(查询本身永远不会执行)并返回它的执行计划。它主要用于性能问题,但也可以用作指针,以防查询确实不正确。