SET FMTONLY OFF 对动态查询存储过程的影响
SET FMTONLY OFF effects on stored procedures with dynamic query
我使用 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
);
The metadata could not be determined because statement 'EXEC sp_executesql @sql' in procedure 'mysp_test' contains dynamic 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
);
我使用 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
);
The metadata could not be determined because statement 'EXEC sp_executesql @sql' in procedure 'mysp_test' contains dynamic 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
);