如果您正在使用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
好的解決方案,謝謝。但正如我所提到的,我無法理解SET FMTONLY OFF的缺點。而且現在,我不知道爲什麼使用WITH RESULT SETS是首選。 – Elnaz
我使用SQL Server 2016管理工作室。 – Elnaz
@Elnaz ['SET FMTONLY'](https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-fmtonly-transact-sql)已棄用功能 – lad2025