1543 votes

Comment SÉLECTIONNER * EN [temp table] à PARTIR de [procédure stockée]

Comment dois-je faire un SELECT * INTO [temp table] FROM [stored procedure]? Pas FROM [Table] et sans la définition d' [temp table]?

Sélectionnez toutes les données de BusinessLine en tmpBusLine fonctionne très bien.

select * 
into tmpBusLine
from BusinessLine

Essayez la même chose, mais à l'aide d'une procédure stockée qui renvoie des données, n'est pas tout à fait la même.

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 sortie de la procédure stockée, qui fonctionne très bien, mais il serait agréable de ne pas fournir toutes les colonnes.

689voto

Aaron Alton Points 9929

Vous pouvez utiliser la fonction OPENROWSET pour cela. Un coup d'oeil. J'ai aussi inclus le code de la procédure stockée sp_configure pour activer les Requêtes Distribuées Ad Hoc, dans le 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

606voto

Gavin Points 5301

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

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

293voto

Matt Hamilton Points 98268

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

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

192voto

Christian Loris Points 2780

C'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 ligne de la table-valeur de la fonction définie par l'utilisateur. C'est essentiellement une procédure stockée (il faudra paramètres) qui retourne un tableau comme un ensemble de résultats; et donc une place bien avec une INTO.

Voici un bon rapide article sur elle et d'un autre utilisateur définie fonctions. Si vous avez encore besoin de conduire pour une procédure stockée, vous pouvez enrouler la table en ligne valeur de la fonction définie par l'utilisateur avec une procédure stockée. La procédure stockée juste passe les paramètres lors de l'appel, sélectionnez * à partir de la table en ligne valeur de la fonction définie par l'utilisateur.

Ainsi, par exemple, vous auriez une table en ligne valeur de la fonction définie par l'utilisateur pour obtenir une liste de clients pour une région en particulier:

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 d'un exemple:

SELECT * FROM CustomersbyRegion(1)

Ou de faire un SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Si vous avez encore besoin d'une procédure stockée, puis les envelopper la fonction en tant que telle:

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

Je pense que c'est le plus "hack" méthode pour obtenir les résultats souhaités. Il utilise les fonctionnalités existantes comme ils étaient destinés à être utilisés sans complications supplémentaires. Par l'imbrication de la table en ligne valeur de la fonction définie par l'utilisateur dans la procédure stockée, vous avez accès à la fonctionnalité de deux façons. Plus! Vous n'avez qu'un seul point de l'entretien pour le code SQL.

L'utilisation de la fonction OPENROWSET a été suggéré, mais ce n'est pas ce que la fonction OPENROWSET était destiné à être utilisé pour (De Livres en Ligne):

Comprend toutes les informations de connexion ce qui est requis pour accéder à des données distantes à partir d'une source de données OLE DB. Cette la méthode est une alternative à l'accès les tables dans un serveur lié et est un un temps, la méthode ad hoc de la connexion et de l'accès à des données à l'aide de OLE DB. Pour des références plus fréquentes à Sources de données OLE DB, utilisez liés les serveurs de la place.

À l'aide de la fonction OPENROWSET le travail sera fait, mais il va devoir assumer des charges supplémentaires pour l'ouverture de connexions locales et de l'ordonnancement de données. Il exige également une requête ad hoc de l'autorisation qui ne peut être désiré. Aussi, la fonction OPENROWSET approche aura pour effet d'empêcher l'utilisation de procédures stockées revenir plus d'un jeu de résultats. Habillage de plusieurs table en ligne de la valeur définie par l'utilisateur fonctions dans une seule procédure stockée peut atteindre cet objectif.

129voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X