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