web-dev-qa-db-fra.com

Les métadonnées n'ont pas pu être déterminées car la procédure stockée contient du SQL dynamique

J'ai une procédure stockée qui contient un SQL dynamique. J'essaie d'exécuter la procédure stockée à l'aide de OPENROWSET mais que je reçois l'erreur:

MSG 11514, niveau 16, état 1, procédure SP_DESCRIRE_FIRST_RESULT_SET, ligne 1

Les métadonnées n'ont pas pu être déterminées car l'instruction 'EXEC SP_EXECUTSQL @SQL, N' @ Row_Count_out Int Sortie ', @row_Count_out = @row_Count_Table sortie;' Dans la procédure "Nachotest" contient une SQL dynamique. Envisagez d'utiliser la clause avec les ensembles de résultats pour décrire explicitement le jeu de résultats.

Ma réelle procédure stockée est un peu plus complexe, mais il s'agit d'un exemple de travail de l'erreur:

La procédure stockée:

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

L'appelant avec OPENROWSET

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC dbo.nachoTest ''e_MFA_All_Tokens''')

J'ai lu un peu en ligne mais je ne peux pas comprendre comment utiliser WITH RESULT SETS Pour résoudre le code. Idéalement, j'aimerais réparer la procédure stockée, mais si je dois changer l'appel OPENROWSET, alors ça va aussi.

1
IMTheNachoMan

Le problème n'est pas dans votre Proc mais dans OPENROWSET/OPENQUERY. Avant SQL Server 2012 pour déterminer la métadonnée des résultatsset set fmtonly a été utilisé. À partir de 2012, il a été remplacé par sp_describe_first_result_set Cela provoque cette erreur.

ici, comment vous pouvez décrire vos résultatsset:

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC dbo.nachoTest ''e_MFA_All_Tokens'' WITH RESULT SETS
(
  (
    cnt int, name sysname
  )
)')

Plus sur EXECUTE WITH RESULT SETS Ici: SQL Server 2012 T-SQL en un coup d'œil - Exécuter avec des ensembles de résultats

5
sepupic