Question Insérer les résultats d'une procédure stockée dans une table temporaire


Comment puis-je faire SELECT * INTO [temp table] FROM [stored procedure]? ne pas FROM [Table] et sans définir [temp table]?

Select toutes les données de BusinessLine dans tmpBusLine fonctionne bien.

select *
into tmpBusLine
from BusinessLine

J'essaie la même chose, mais en utilisant un stored procedure cela renvoie des données, n'est pas tout à fait la même chose.

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

Message de sortie:

Msg 156, niveau 15, état 1, ligne 2   Syntaxe incorrecte près du mot clé   'exec'.

J'ai lu plusieurs exemples de création d'une table temporaire avec la même structure que la procédure stockée en sortie, ce qui fonctionne bien, mais ce serait bien de ne pas fournir de colonnes.


1336
2018-03-17 10:45


origine


Réponses:


Vous pouvez utiliser OPENROWSET pour ça. Regarde. J'ai également inclus le code sp_configure pour activer les requêtes distribuées ad hoc, au cas où il n'est pas déjà activé.

CREATE PROC getBusinessLineHistory
AS
BEGIN
    SELECT * FROM sys.databases
END
GO

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC getBusinessLineHistory')

SELECT * FROM #MyTempTable

619
2017-08-04 15:27



Si vous voulez le faire sans d'abord déclarer la table temporaire, vous pouvez essayer de créer une fonction définie par l'utilisateur plutôt qu'un procédure stockée et rend cette fonction définie par l'utilisateur retourne une table. Alternativement, si vous voulez utiliser la procédure stockée, essayez quelque chose comme ceci:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

517
2018-03-17 14:08



Dans SQL Server 2005, vous pouvez utiliser INSERT INTO ... EXEC pour insérer le résultat d'une procédure stockée dans une table. De MSDN INSERT Documentation (pour SQL Server 2000, en fait):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

267
2018-03-17 10:50



Ceci est une réponse à une version légèrement modifiée de votre question. Si vous pouvez abandonner l'utilisation d'une procédure stockée pour une fonction définie par l'utilisateur, vous pouvez utiliser une fonction définie par l'utilisateur inline. C'est essentiellement une procédure stockée (prendra des paramètres) qui retourne une table en tant que jeu de résultats; et sera donc bien placé avec une déclaration INTO.

Voici un bon article rapide sur lui et d'autres fonctions définies par l'utilisateur. Si vous avez toujours besoin d'une procédure stockée, vous pouvez envelopper la fonction inline définie par l'utilisateur avec une procédure stockée. La procédure stockée transmet simplement les paramètres lorsqu'elle appelle select * à partir de la fonction inline définie par l'utilisateur.

Ainsi, par exemple, vous auriez une fonction définie par l'utilisateur in-table, définie par l'utilisateur, pour obtenir une liste de clients pour une région particulière:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

Vous pouvez ensuite appeler cette fonction pour obtenir ce que vos résultats sont tels:

SELECT * FROM CustomersbyRegion(1)

Ou faire un SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Si vous avez toujours besoin d'une procédure stockée, enveloppez la fonction en tant que telle:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

Je pense que c'est la méthode la plus «sans hack» pour obtenir les résultats souhaités. Il utilise les fonctionnalités existantes car elles étaient destinées à être utilisées sans complications supplémentaires. En imbriquant la fonction définie par l'utilisateur in-table dans la procédure stockée, vous avez accès à la fonctionnalité de deux manières. Plus! Vous avez seulement un point de maintenance pour le code SQL réel.

L'utilisation d'OPENROWSET a été suggérée, mais ce n'est pas ce à quoi la fonction OPENROWSET a été destinée (De la documentation en ligne):

Inclut toutes les informations de connexion   qui est requis pour accéder aux données à distance   à partir d'une source de données OLE DB. Ce   méthode est une alternative à l'accès   tables dans un serveur lié et est un   méthode unique de connexion ponctuelle   et accéder aux données distantes en utilisant OLE   DB. Pour des références plus fréquentes à   Sources de données OLE DB, utilisez lié   serveurs à la place.

L'utilisation d'OPENROWSET fera le travail, mais elle entraînera des frais supplémentaires pour l'ouverture des connexions locales et la collecte des données. Il peut également ne pas être une option dans tous les cas, car il nécessite une autorisation de requête ad hoc qui pose un risque de sécurité et peut donc ne pas être souhaitée. En outre, l'approche OPENROWSET empêchera l'utilisation de procédures stockées renvoyant plusieurs jeux de résultats. Le fait d'emballer plusieurs fonctions définies par l'utilisateur de valeur table en ligne dans une seule procédure stockée peut y parvenir.


166
2017-08-04 17:11



SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC test.dbo.prc_test 1')

100
2018-03-17 10:50



La solution la plus simple:

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

Si vous ne connaissez pas le schéma, vous pouvez effectuer les opérations suivantes. S'il vous plaît Notez qu'il existe de graves risques de sécurité dans cette méthode.

SELECT * 
INTO #temp
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'EXEC [db].[schema].[sproc]')

90
2018-03-13 19:38



Lorsque la procédure stockée renvoie un grand nombre de colonnes et que vous ne voulez pas "créer" manuellement une table temporaire pour contenir le résultat, j'ai trouvé le moyen le plus simple d'entrer dans la procédure stockée et d'ajouter une clause "into" sur le dernière instruction select et ajoutez 1 = 0 à la clause where.

Exécutez la procédure stockée une fois et revenez en arrière et supprimez le code SQL que vous venez d'ajouter. Maintenant, vous aurez une table vide correspondant au résultat de la procédure stockée. Vous pouvez soit "script table as create" pour une table temporaire, soit simplement l'insérer directement dans cette table.


80
2018-03-17 14:06



declare @temp table
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);
INSERT @temp  Exec sp_helpfile;
select * from @temp;

60
2018-03-24 07:15