无法确定元数据,因为存储过程包含动态 SQL

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调用,那也没关系。

sep*_*pic 6

问题不在您的 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