【问题标题】:SET FMTONLY OFF effects on stored procedures with dynamic querySET FMTONLY OFF 对具有动​​态查询的存储过程的影响
【发布时间】:2017-08-08 06:52:01
【问题描述】:

我使用 Telerik Report Designer R1 2017,并使用带有动态查询的存储过程作为数据源。似乎无法从动态查询中获取架构。我用谷歌搜索,发现如果不在存储过程的开头添加以下几行是不可能的

IF 1 = 0 BEGIN
 SET FMTONLY OFF
END

但是我用这种方式执行起来真的很慢!我对存储过程执行过程不是很熟悉。我想知道它(SET FMTONLY OFF)有什么负面影响?

【问题讨论】:

    标签: sql-server tsql stored-procedures telerik telerik-reporting


    【解决方案1】:

    如果您使用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

    【讨论】:

    • 很好的解决方案,谢谢。但正如我在问题中提到的,我无法理解 SET FMTONLY OFF 的缺点。而且现在,我不知道为什么首选使用 WITH RESULT SETS。
    • @Elnaz SET FMTONLY 已弃用功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多