【问题标题】:How can I parse dynamic SQL before execution in T-SQL?如何在 T-SQL 中执行之前解析动态 SQL?
【发布时间】:2010-10-24 10:57:18
【问题描述】:

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

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

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

【问题讨论】:

  • 在 C# 代码中?在 SQL Server Management Studio 内部??不清楚.....

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


【解决方案1】:

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

SET PARSEONLY ON SET PARSEONLY OFF 应该适用于大多数情况。

MSDN FMTONLY

【讨论】:

    【解决方案2】:

    这可能通过一些 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】:

      你想完成什么?

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

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

      set showplan_xml on
      

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

      【讨论】:

      • 绝妙的解决方案!我一直使用 set ftmonly on,但它是 Sql Server 2012 中已弃用的功能 :(
      猜你喜欢
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2022-01-18
      • 2010-11-05
      • 2015-01-23
      • 2020-06-08
      相关资源
      最近更新 更多