web-dev-qa-db-fra.com

SQL Server: placez le résultat de la procédure stockée dans une variable de table sans spécifier son schéma

J'ai une procédure stockée avec beaucoup de paramètres.

Je veux insérer (ou peut-être sélectionner) comme ceci:

INSERT INTO @TEMP_TABLE
    EXECUTE STORED_PROCEDURE

sans définir le schéma de @TEMP_TABLE.

12
naeron84

Vous ne pouvez pas faire cela avec un @tablevariable.

Le travail autour de le lien posté par Joe utilise SELECT ... INTO.

Ceci n'est actuellement pas supporté par les variables de table (et ne proviendra jamais de la réponse à cet élément de connexion ) car le schéma des variables de table doit être connu au moment de la compilation.

5
Martin Smith

par exemple:

declare @temptable2 as table
(
 DatabaseName nvarchar(128),
 dbsize nvarchar(128),
 owner varchar(128),
 dbid nvarchar(128),
 created nvarchar(128),
 status nvarchar(128),
 compatibility_level nvarchar(128)
)

INSERT INTO @temptable2
EXEC ('sp_helpdb')
20
skorpk

La seule façon d’y parvenir est d’utiliser une solution de contournement accrocheuse de SELECT INTO une table #temp.

il suffit de coder la variable de table avec les colonnes nécessaires. Ajoutez ensuite des commentaires bien visibles et bien situés dans les deux procédures stockées pour rappeler au codeur cette dépendance et passez à d'autres tâches. 

5
KM.
CREATE PROCEDURE [dbo].[Sp_TestA](@P1 AS VARCHAR(50), @P2 AS VARCHAR(50),@P3 AS VARCHAR(50)) AS BEGIN

    SELECT '1' AS Col1,@P1 AS Col2,@P2 AS Col3,@P3 AS Col4 UNION
    SELECT '1' AS Col1,'A1' AS Col2,'A2' AS Col3,'A3' AS Col4 UNION
    SELECT '2' AS Col1,'B1' AS Col2,'B2' AS Col3,'B3' AS Col4 UNION
    SELECT '3' AS Col1,'C1' AS Col2,'C2' AS Col3,'C3' AS Col4 UNION
    SELECT '4' AS Col1,'D1' AS Col2,'D2' AS Col3,'D3' AS Col4;
END

Declare @TblRtRcs TABLE(Col1 VARCHAR(50)NOT NULL,Col2 VARCHAR(50) NOT NULL,Col3 VARCHAR(50) NOT NULL,Col4 VARCHAR(50) NOT NULL);

DECLARE @Sql AS VARCHAR(MAX);

SET @Sql='EXEC [Sp_TestA @P1=''xA'',@P2=''xB'',@P3=''xC''';

INSERT INTO @TblRtRcs(Col1,Col2,Col3,Col4) EXEC(@Sql);

SELECT * FROM @TblRtRcs;
1
MJelvani

Cette réponse de @skorpk me semble réellement la bonne réponse à la question posée. En effet, vous pouvez insérer des variables dans le tableau comme la question semble l'indiquer. En outre, vous pouvez également le faire avec des procédures stockées qui attendent des paramètres. Voir exemple de code ci-dessous:

Cette réponse m’apparaît comme la bonne réponse à la question posée. En effet, vous pouvez insérer des variables dans le tableau comme la question semble l'indiquer. En outre, vous pouvez également le faire avec des procédures stockées qui attendent des paramètres. Voir exemple de code ci-dessous:

/*Create stored procedure for this example.       */
/*It will simulate results and we can clean it up */
/*later in this example                           */
create proc sproc_get_friends (@context_user_id int)
as
             select @context_user_id as id, 'me' as name
   union all select 1234678910 as id, 'Jane Doe' as name
   union all select 1112131415 as id, 'John Doe' as name
go

/*Create temp variable*/
declare @tmp as table ( friend_user_id int, friend_name nvarchar(100) )

/*Insert into temp variable from stored procedure*/
INSERT INTO @tmp exec  ('sproc_get_friends 10000')

/*Show data in temp variable*/
select * from @tmp
go

---Clean up
drop proc sproc_get_friends
go
0
Awah Teh