2009-11-02 9 views
2

Quel est le moyen le plus rapide d'importer des données dans une base de données SQL Server directement à partir de la feuille de calcul active dans Excel?Quelle est la méthode la plus rapide pour importer de la feuille active dans Excel vers SQL Server?

J'ai eu beaucoup de succès simplement en bouclant les lignes et les colonnes, en générant une chaîne SQL, en ouvrant une ADODB.Connection et en exécutant le SQL. Cette solution, cependant, est trop lente pour les grands ensembles de données. Donc, je suis en train de tester le Jet Provider avec ADO. C'est certainement plus rapide, mais il faut que le classeur soit sauvegardé, et je ne peux pas demander à l'utilisateur d'enregistrer le classeur avant de le télécharger.

Le code suivant fonctionne si le classeur a été enregistré, mais si ActiveWorkbook n'a jamais été enregistré ActiveWorkbook.Path renvoie une chaîne null et le code échoue.

Sub UploadViaJet() 

    Dim objADO As New ADODB.Connection 
    Dim strSQL As String 
    Dim lngRecsAff As Long 

    Set objADO = New ADODB.Connection 

    objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & ActiveWorkbook.Path & _ 
     "\" & ActiveWorkbook.Name & ";" & _ 
     "Extended Properties=Excel 8.0" 

    strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _ 
     "Server=<server>;Database=<database>;" & _ 
     "UID=<UID>;PWD=<PWD>].test_table " & _ 
     "FROM [" & ActiveSheet.Name & "$]" 

    objADO.Execute strSQL, lngRecsAff, adExecuteNoRecords 

End Sub 

Existe-t-il une manière plus simple et plus rapide de faire cela?

Répondre

1

Solution à l'aide d'importation fichier Excel

Puisque vous avez une restriction à ne pas forcer l'utilisateur à enregistrer le fichier, et les solutions les plus proposées exigent que le dossier soit sauvegardé, j'utiliser VBA pour

  • créer un objet de classeur dans la mémoire
  • pâte de copie de feuille active de cahier d'exercices
  • classeur SAVEAS à un nom de fichier temporaire (de TempExcelFile.xls) et le chemin
  • utiliser la méthode de Quassnoi ci-dessus pour importer dans SQL Server
  • Ecraser TempExcelFile.xls avec des zéros
  • suppression TempExcelFile.xls

De cette façon, l'utilisateur ne sera pas obligé d'enregistrer la feuille de calcul, et ils être invité à le sauvegarder comme ils le feraient pendant le cours normal de leur travail.

Pour faciliter l'importation simultanée de plusieurs feuilles de calcul actives, j'utiliserais un horodatage ou un GUID pour créer les noms de fichier.


Solution ADO à l'aide de requêtes

vos utilisateurs à créer leurs classeurs à partir d'un modèle qui a des macros VBA construit en Assurez-vous de protéger le classeur pour empêcher l'accès non autorisé aux macros/code derrière.

Exécute une macro qui parcourt les lignes et les colonnes, lit les valeurs des cellules, construit une requête SQL et l'exécute - utilise des procédures stockées avec des paramètres pour empêcher les attaques par injection.

+0

Pourquoi ne pas simplement utiliser l'API du fichier temporaire Windows? –

+0

C'est une bonne idée, sauf que la question indique que l'utilisateur ne devrait pas être invité à enregistrer le fichier. Donc, copier le contenu dans un fichier différent et utiliser l'API Windows Temp File serait mon choix. –

+0

J'ai utilisé des requêtes distribuées ADO jusqu'à ce point. Cela a bien fonctionné pour moi, mais mes tailles de données ont augmenté au point que les opérations durent longtemps et dépassent parfois la capacité de mémoire de l'ordinateur. L'utilisation d'un fichier temporaire semble être une bonne solution, même si cela nécessite de gérer le fichier temporaire. Merci Raj! – Kuyenda

1

En général, j'importe de gros fichiers Excel en utilisant SSIS.

+0

Cela ne peut pas être fait, sauf si le classeur est enregistré –

+0

HLGEM, pouvez-vous élaborer sur SSIS? Je suis à la recherche d'une introduction à l'utilisation de SSIS avec Excel, mais je n'ai pas encore trouvé quelque chose qui en vaille la peine. Avez-vous un code d'exemple? Merci. – Kuyenda

2

Vous pouvez créer une source de données (en utilisant un serveur lié ou OPENROWSET) et juste faire un SELECT sur SQL Server côté:

SELECT * 
INTO mytable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]') 

Le chemin avec le classeur Excel doit être accessible par le SQL Server.

Voici un KB article sur la façon de procéder.

+0

Cela nécessite que le classeur soit téléchargé sur le serveur en premier, correct? – Kuyenda

+0

Il doit être accessible par le 'SQL Server', c'est-à-dire que le chemin UNC fonctionnera également. Mais d'une manière générale, oui, il devrait être téléchargé. – Quassnoi

+0

Oui, cela nécessite que le fichier soit enregistré. Voir ma réponse pour une solution possible à cela. –

0

Avez-vous essayé de mettre un ActiveWorkBook.SaveAs ("some temp filename") en haut, et d'en importer? Je fais quelque chose de similaire avec une macro pour FTP le contenu de l'ActiveSheet à un serveur distant et cela fonctionne.