首页 文章

使用动态查询对存储过程设置FMTONLY OFF效果

提问于
浏览
2

我使用Telerik Report设计器R1 2017,并使用带有动态查询的存储过程作为数据源 . 看起来无法从动态查询中获取模式 . 我用Google搜索并发现如果不在存储过程的开头添加以下行,则无法实现

IF 1 = 0 BEGIN
 SET FMTONLY OFF
END

但是这样我的执行速度确实很慢!我对存储过程执行过程不是很熟悉 . 我想知道它有什么负面影响( SET FMTONLY OFF )?

1 回答

  • 3

    如果您使用的是 SQL Server 2012+ ,则可以使用 WITH RESULT SETS 来定义结果集:

    CREATE OR ALTER PROCEDURE dbo.mysp_test
    AS
    BEGIN
    
       DECLARE @sql NVARCHAR(MAX) = 'SELECT id, b FROM dbo.tab  ' + 'WHERE 1=1';
    
       EXEC sp_executesql @sql
    
    END
    GO
    
    SELECT *
    FROM sys.dm_exec_describe_first_result_set (
      'EXEC dbo.mysp_test'
      ,NULL
      ,NULL
    );
    

    无法确定元数据,因为过程'mysp_test'中的语句'EXEC sp_executesql @sql'包含动态SQL .

    使用 WITH RESULT SETS

    CREATE OR ALTER PROCEDURE dbo.mysp_test
    AS
    BEGIN
    
       DECLARE @sql NVARCHAR(MAX) = 'SELECT id, b FROM dbo.tab  ' + 'WHERE 1=1';
    
       EXEC sp_executesql @sql
       WITH RESULT SETS(  
            (id INT NOT NULL,
             b CHAR(1)
            )  
        ); 
    END
    GO
    
    SELECT *
    FROM sys.dm_exec_describe_first_result_set (
      'EXEC dbo.mysp_test'
      ,NULL
      ,NULL
    );
    

    DBFiddle Demo

相关问题