如何在T-SQL中执行之前解析动态SQL?

时间:2009-05-07 10:55:06

标签: sql-server-2005 tsql parsing dynamic-sql

我需要知道在执行查询之前如何解析查询以确定它是否构建良好。如果解析是正确的,那么执行它,如果不丢弃它。

我无法使用SET NOEXEC,SET PARSEONLY,TRY / CATCH完成此操作。

我在循环中使用动态sql 。有时动态sql 不正确,不是因为我的错,而是因为数据库中存在的信息。出于这个原因,我想在执行之前解析它。

3 个答案:

答案 0 :(得分:7)

对于某些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不兼容,所以我正在检查返回值。

答案 1 :(得分:3)

尝试使用SET FMTONLY ON和SET FMTONLY OFF。

设置PARTIONONLY ON您的代码SET PARSEONLY OFF应该适用于大多数。

MSDN FMTONLY

答案 2 :(得分:3)

你想要完成什么?

如前所述,除非查询是可解析的,否则T-SQL将无法编译。

如果您只想验证查询是否正常(例如,验证您没有忘记where语句),那么showplan可能会帮助您

set showplan_xml on

这将告诉sql server只解析查询(查询本身永远不会被执行)并返回它的执行计划。它主要用于性能问题,但也可以用作指针,以防查询错误。