2

我使用Telerik Report设计器R1 2017,并使用具有动态查询的存储过程作为数据源。看起来无法从动态查询中获取模式。我用Google搜索,发现这是不可能的,而不在存储过程使用动态查询设置FMTONLY OFF对存储过程的影响

IF 1 = 0 BEGIN 
SET FMTONLY OFF 
END 

的开头添加以下行,但我用这种方式有很慢的执行!我不是很熟悉商店程序的执行过程。我想知道它有什么负面影响(SET FMTONLY OFF)?

回答

2

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

+0

好的解决方案,谢谢。但正如我所提到的,我无法理解SET FMTONLY OFF的缺点。而且现在,我不知道为什么使用WITH RESULT SETS是首选。 – Elnaz

+0

我使用SQL Server 2016管理工作室。 – Elnaz

+1

@Elnaz ['SET FMTONLY'](https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-fmtonly-transact-sql)已弃用功能 – lad2025