2017-08-08 118 views
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