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



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

IF 1 = 0 BEGIN
SET FMTONLY OFF
END

但是我以这种方式执行得真的很慢!我对存储过程执行过程不是很熟悉。我想知道它(SET FMTONLY OFF(会产生什么负面影响?

如果您使用的是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 演示

最新更新