IMT*_*Man 1 sql-server stored-procedures dynamic-sql openrowset sql-server-2014
我有一个包含一些动态 SQL 的存储过程。我正在尝试使用执行存储过程,OPENROWSET
但出现错误:
消息 11514,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 行
无法确定元数据,因为语句 'EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;' 在过程 'nachoTest' 中包含动态 SQL。考虑使用 WITH RESULT SETS 子句来显式描述结果集。
我真正的存储过程有点复杂,但这是错误的一个工作示例:
存储过程:
CREATE PROCEDURE nachoTest @table_name NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @row_count_table INT
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT @row_count_out = COUNT(*) FROM ' + @table_name
EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;
SELECT @row_count_table AS row_count, @table_name AS table_name
END
GO
Run Code Online (Sandbox Code Playgroud)
调用它 OPENROWSET
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC dbo.nachoTest ''e_MFA_All_Tokens''')
Run Code Online (Sandbox Code Playgroud)
我在网上阅读了一些,但不知道如何使用WITH RESULT SETS
来修复代码。理想情况下,我想修复存储过程,但如果我必须更改OPENROWSET
调用,那也没关系。
问题不在您的 proc 中,而在OPENROWSET
/ 中OPENQUERY
。在 SQL Server 2012 之前,set fmtonly
使用了用于计算结果集元数据的方法。从 2012 年开始,它被替换为sp_describe_first_result_set
导致此错误的原因。
在这里你可以如何描述你的结果集:
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC dbo.nachoTest ''e_MFA_All_Tokens'' WITH RESULT SETS
(
(
cnt int, name sysname
)
)')
Run Code Online (Sandbox Code Playgroud)
更多EXECUTE WITH RESULT SETS
信息:SQL Server 2012 T-SQL 概览 – EXECUTE WITH RESULT SETS