2009-05-14 10 views
2

J'essaie d'écrire une procédure stockée qui va lire un fichier Excel dans une table temporaire, puis masser certaines des données de cette table, puis insérer les lignes sélectionnées de cette table dans une table permanente.Utilisation de openrowset pour lire un fichier Excel dans une table temporaire; comment puis-je référencer cette table?

Ainsi, il commence comme ceci:

SET @SQL = "select * into #mytemptable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database="[email protected]+";HDR=YES', 'SELECT * FROM [Sheet1$]')" 

EXEC (@SQL) 

Ce bien semble fonctionner.

Cependant, si je puis essayer quelque chose comme ceci:

Select * from #mytemptable 

Je reçois une erreur:

Nom d'objet incorrect '#mytemptable'

Pourquoi #mytemptable pas reconnu ? Existe-t-il un moyen d'avoir #mytemptable accessible au reste de la procédure stockée?

Un grand merci d'avance!

Répondre

5

Je n'ai pas le temps de se moquer de tout ça, donc je ne sais pas si ça va marcher, mais essayez d'appeler votre table « ## mytemptable » au lieu de « #mytemptable »

Je suis deviner votre problème est que votre table n'est plus dans la portée après exec() la chaîne sql. Les tables temporaires précédées de deux symboles sont globalement accessibles. N'oubliez pas de le laisser tomber quand vous en avez fini!

+0

Lunchy - cela fonctionne parfaitement - merci beaucoup! Cependant, que se passera-t-il si deux ou plusieurs utilisateurs exécutent le proc stocké en même temps? Est-ce que le fait que ## mytemptable a une portée globale cause des problèmes? Ou SQL Server crée-t-il des instances distinctes, même si les tables temporaires portent le même nom? – mattstuehler

+0

Oui, ils vont s'affronter, alors vous devrez trouver un moyen d'éviter cela, et malheureusement, je n'ai pas beaucoup de bons conseils sur la façon de le faire. Je comprends que vous avez besoin de exec() cette chaîne parce que vous concatenez le nom de fichier dans la requête, mais est-ce vraiment nécessaire? Si vous pouvez l'éviter, ce n'est pas un problème car vous pouvez exécuter la requête sans exec() et revenir à l'utilisation d'une table temporaire de portée locale. Dans mon expérience, exec() ing conduit toujours à la douleur à un moment donné. :) –

+0

Lunchy - merci encore. Malheureusement, je ne sais pas comment contourner exec(), car le nom du fichier sera toujours différent. L'utilisation d'une table temporaire à portée globale est également interdite, car il est possible que plusieurs utilisateurs appellent ce proc stocké en même temps. J'ai également envisagé d'utiliser une variable de table au lieu d'une table temporaire, mais je ne veux pas définir la structure de la table à l'avance - je veux que cela soit dynamique et provienne de la feuille de calcul Excel. Donc, retour à la case 1, je suppose ... – mattstuehler

2

La façon dont je l'ai fait dans le passé était de: D'abord, créez le #temp_table en utilisant CREATE TABLE. Ensuite, construisez la requête dynamique comme d'habitude en l'insérant dans #temp_table Troisièmement, utilisez exec sp_executesql @sql.

Avec cette méthode, vous n'avez pas besoin de la portée globale ## temp_table.

2

Vous pouvez l'utiliser dans la même portée, y compris le script entier dans la requête dynamique:

DECLARE @strSQL nvarchar(max) 
DECLARE @file varchar(100) 

SET @file='c:\myfile.xls' 
SET @strSQL=N'SELECT * INTO #mytemptable FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;Database='[email protected]+';HDR=YES'', ''SELECT * FROM [Sheet1$]'');' 
SET @[email protected]+N'SELECT * FROM #mytemptable' 

EXECUTE sp_executesql @strSQL 
Questions connexes