5

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

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

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

4

3 回答 3

8

这可能通过一些 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 一起使用,所以我改为检查返回值。

于 2009-05-07T11:06:09.120 回答
3

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

SET PARSEONLY ON 你的代码 SET PARSEONLY OFF 应该适用于大多数人。

MSDN FMTONLY

于 2009-05-07T11:03:35.943 回答
3

你想达到什么目的?

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

如果您只是想有一种方法来验证查询是否正常(例如,验证您没有忘记 where 语句左右),那么 showplan 可能会对您有所帮助

set showplan_xml on

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

于 2009-05-07T11:12:56.137 回答