2010-02-12 5 views
2

À l'aide de SQL Server 2005, je voudrais exécuter une procédure stockée et insérer tous les résultats dans une nouvelle table.SQL - Comment insérer les résultats de Stored_Proc dans une nouvelle table sans spécifier les colonnes de la nouvelle table?

Je souhaite que la nouvelle table ait ses colonnes automatiquement configurées en fonction des données renvoyées par la procédure stockée.

Je connais en utilisant la syntaxe SELECT ... INTO:

SELECT * INTO newtable FROM oldtable 

Est-ce possible?

Modifier des éclaircissements: J'espère accomplir quelque chose comme:

Select * INTO newtable FROM exec My_SP 

Répondre

2

La seule façon de le faire est w/OPENROWSET contre local serveur:

SELECT * INTO #temp 
FROM OPENROWSET (
    'SQLOLEDB' 
    , 'Server=(local);TRUSTED_CONNECTION=YES;' 
    , 'SET FMTONLY OFF EXEC database.schema.procname' 
) a 

Mais ce genre est d'une dernière chance, dois-do-it-putain-la-type de conséquences meth od. Il nécessite des autorisations élevées, ne fonctionne pas pour toutes les procédures et est généralement inefficace.

Plus d'infos et quelques alternatives ici: http://www.sommarskog.se/share_data.html

+0

Désolé @Peter, j'ai mentionné le lien d'Erland dans un commentaire de suivi à ma réponse; Je n'avais pas réalisé que vous l'aviez déjà signalé. –

0

Une variante du même est

create table somename 
    select * from wherever; 
2

Cela semble être un design horrible. Vous allez vraiment créer une nouvelle table pour stocker les résultats d'une procédure stockée, chaque fois que la procédure stockée est appelée? Et vous ne pouvez vraiment pas créer la table à l'avance parce que vous n'avez aucune idée du type de sortie de la procédure stockée? Que faire si la procédure stockée renvoie plusieurs jeux de résultats? Et si cela a des effets secondaires?

Bon, eh bien, si c'est ce que vous voulez vraiment faire ...

Une façon d'y arriver est d'utiliser votre serveur local en tant que serveur lié et utiliser OPENQUERY. D'abord, vous devez vous assurer que votre serveur local est configuré pour l'accès aux données:

EXEC sp_serveroption 'local server name', 'DATA ACCESS', true; 

vous pouvez faire quelque chose comme ceci:

SELECT * INTO dbo.newtable 
FROM OPENQUERY('local server name', 'EXEC yourdb.dbo.yourproc;'); 

PS Comment allez-vous d'écrire du code qui va effectuer SELECT INTO dans un nouveau nom de table à chaque fois (parce que vous ne pouvez faire SELECT INTO qu'une seule fois)? SQL dynamique? Que se passe-t-il si deux utilisateurs exécutent ce code en même temps? Est-ce que l'un d'entre eux gagne, et l'autre reçoit juste un message d'erreur?

+0

Selon vous, OPENQUERY ou OPENROWSET est ce qu'il y a de mieux pour ce genre de choses? Je n'ai pas assez d'expérience ou de tests pour savoir si cela fait une différence ou dans quelles dimensions. –

+0

Nous avons eu un problème de communication - édité la question pour des éclaircissements concernant moi devoir faire ceci chaque fois que le SP est exécuté. Ce n'est pas le cas. C'est une affaire à un ou deux temps pour l'analyse des données. Je suis simplement fatigué de taper 25 noms de colonnes et types de données pour correspondre au retour SP –

+0

@Peter, mon instinct me dit que l'utilisation d'OPENQUERY est un peu plus rapide, car il utilise le fournisseur natif et le serveur lié directement, par rapport à aller sur le système d'exploitation pour utiliser le fournisseur OLEDB ...J'imagine qu'il doit y avoir des frais généraux avec ça. Mais je qualifierai ma déclaration pour dire que je n'ai pas fait de tests de performance approfondis. Dans ce cas, compte tenu des commentaires supplémentaires du PO, cela ne semble pas être une question de performance, donc je suppose que ce n'est pas vraiment un facteur de décision. –

Questions connexes