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

时间:2017-08-08 06:52:01

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

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

IF 1 = 0 BEGIN
 SET FMTONLY OFF
END

但是我以这种方式执行的速度很慢!我对商店流程执行过程不是很熟悉。我想知道它(SET FMTONLY OFF)有什么负面影响?

1 个答案:

答案 0 :(得分: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
);
  

无法确定元数据,因为语句' EXEC sp_executesql @sql'在程序' mysp_test'包含动态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