Comment créer et remplir un tableau en une seule étape dans le cadre d'une opération d'importation CSV?

je suis à la recherche d'un moyen rapide et sale pour importer des fichiers CSV dans le serveur SQL sans avoir à créer la table à l'avance et définir ses colonnes .

chaque CSV importée serait importée dans sa propre table.

nous ne sommes pas préoccupés par l'inférence de type de données. La structure et la disposition de la CSV varient, et chacune d'entre elles comporte de nombreuses colonnes, mais nous ne nous intéressons qu'à quelques-unes d'entre elles: les adresses des rues et des zipcodes. Nous voulons simplement obtenir les données CSV dans la base de données SQL rapidement et extraire les colonnes pertinentes.

j'aimerais fournir le bus de terrain et le bus de rames, le pointer au CSV, et demander à l'utilitaire de faire le reste. Y a-t-il un moyen de créer la table et de la remplir, en une seule étape, en utilisant BULK INSERT et/ou OpenRowset(BULK ... ) ?

15
demandé sur Tim 2012-05-02 21:07:56

2 réponses

Referencing SQLServerPedia , je pense que ça va marcher:

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

select TerritoryID
      ,TotalSales
      ,TotalCost
INTO CSVImportTable
from openrowset('MSDASQL'
               ,'Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
               ,'select * from C:\csvtest.CSV')
11
répondu TyT 2015-06-09 23:20:34

agaçant, Je n'ai pas encore les points rep à juste commenter, donc je vais ajouter une réponse basée sur Tyt's (qui poignée semble terrible dans possessive, btw ...)

le code de l'ouvrier avait besoin d'un double " \ "au lieu d'un simple pour moi pour éviter une erreur" fichier non trouvé". Et vous n'avez pas à spécifier les champs; ils seront déduits de la première ligne du fichier:

select *
into   CsvImportTable
from   openrowset(
           'MSDASQL',
           'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
           'select * from C:\csvtestfile.csv')

Je n'ai eu aucun problème avec le conducteur D'accès.

Mise à jour: si vous avez des problèmes avec les types étant inférés incorrectement, insérez quelques lignes en haut du fichier avec les données du type que vous voulez dans la table ainsi vous obtenez, dire texte -> VARCHAR au lieu de texte-> INT et puis supprimer ces lignes après l'importation.

comme le givrage final, ajouter un PK à la table de sorte que vous pouvez manipuler les données-supprimer les lignes de mannequin, etc:

alter table CsvImportTable add Id int identity(1, 1)
7
répondu SteveCinq 2016-04-10 05:47:04