Générer un script d'insertion SQL à partir d'une feuille de calcul Excel


107

J'ai une grande feuille de calcul Excel que je souhaite ajouter à ma base de données.

Puis-je générer un script d'insertion SQL à partir de cette feuille de calcul Excel?


2
J'ai créé un outil simple pour obtenir des scripts SQL pour les deux insertet update ici
Pathros

Vous pouvez également utiliser ma macro VBA pour générer des commandes SQL. Plus d'informations ici: stackoverflow.com/questions/1570387/...
Petrik

Réponses:


202

Je pense que l'importation à l'aide de l'une des méthodes mentionnées est idéale s'il s'agit vraiment d'un fichier volumineux, mais vous pouvez utiliser Excel pour créer des instructions d'insertion:

="INSERT INTO table_name VALUES('"&A1&"','"&B1&"','"&C1&"')"

Dans MS SQL, vous pouvez utiliser:

SET NOCOUNT ON

Ne pas afficher tous les commentaires «1 ligne affectée». Et si vous faites beaucoup de lignes et qu'il y a des erreurs, mettez un GO entre les instructions de temps en temps


3
J'utilisais =CONCATENATE()mais utiliser le &signe conduit à une bien meilleure lisibilité!
mastazi le

1
@mastazi d'accord! Je suis passé à &lorsque je suis tombé sur la limite de paramètres il y a CONCATENATE()quelque temps, ce n'est pas un problème courant maintenant que la limite est de 255 paramètres, mais je ne pense jamais à revenir en arrière.
Hart CO

1
CONCATENATE () est la voie à suivre. Cliquez simplement sur l'icône fx dans la barre de formule pour voir ce que vous avez entré. C'est beaucoup plus propre que simplement utiliser et signer. Bien sûr, utiliser & signer est cool, mais parfois, lorsque vous avez des guillemets doubles ou simples, cela vous fera compter pour toujours ce qui manque.
ian0411

1
Ne fonctionne pas avec des citations dans les cellules. Vérifiez ma réponse pour une version corrigée.
Simon Baars

2
@PreshanPradeepa Vous pouvez utiliser la même syntaxe, SQL Server ne se soucie pas de savoir si l'entier est entre guillemets tant qu'il s'agit d'un entier valide.
Hart CO

29

Il existe un outil pratique qui permet de gagner beaucoup de temps

http://tools.perceptus.ca/text-wiz.php?ops=7

Il vous suffit de renseigner le nom de la table, les noms des champs et les données - séparés par des tabulations et appuyez sur Go!


7
Ne publiez pas vos données sensibles sur le Web. Vous n'avez aucun moyen de savoir ce qu'il advient des données que vous soumettez à l'application Web. Certains de ces outils stockent vos données et les rendent publiques
GabiM

28

Vous pouvez créer une table appropriée via l'interface du studio de gestion et insérer des données dans la table comme indiqué ci-dessous. Cela peut prendre un certain temps en fonction de la quantité de données, mais c'est très pratique.

entrez la description de l'image ici

entrez la description de l'image ici


Pratique. Je vois qu'avec une colonne IDENTITY, le tampon de copie doit avoir la colonne, même si les données qu'il contient seront ignorées car les valeurs sont générées automatiquement lorsque les lignes sont insérées.
fortboise

Vous pouvez faire de votre colonne IDENTITY la dernière dans la liste des colonnes et il ne serait pas du tout nécessaire d'avoir une colonne supplémentaire.
Andrey Morozov

1
si vous ne spécifiez pas les valeurs IDENTITY dans la feuille Excel; vous pouvez modifier et réexécuter le script sql d'édition des 200 premières lignes en supprimant la colonne IDENTITY. Ainsi, lorsque vous copiez et collez les valeurs sans IDENTITY; cette méthode fonctionnera.
aozan88

Ceci est interrompu pour les champs de date et d'heure dans Excel pour toute autre personne confrontée au problème. Les données datetime sont converties en données "binaires" côté SQL pour une raison quelconque.
Kevin Vasko

1
@condiosluzverde Je vous conseillerais de poster votre propre réponse. En cas de modification de cette réponse, vos modifications seront probablement rejetées par les modérateurs de la communauté.
Andrey Morozov

16

Vous pouvez utiliser l'instruction Excel suivante:

="INSERT INTO table_name(`"&$A$1&"`,`"&$B$1&"`,`"&$C$1&"`, `"&$D$1&"`) VALUES('"&SUBSTITUTE(A2, "'", "\'")&"','"&SUBSTITUTE(B2, "'", "\'")&"','"&SUBSTITUTE(C2, "'", "\'")&"', "&D2&");"

C'est mieux que la réponse de Hart CO car elle prend en compte les noms de colonne et élimine les erreurs de compilation dues aux guillemets dans la colonne. La dernière colonne est un exemple de colonne de valeur numérique, sans guillemets.


1
Bon travail. Dans GoogleSheets, j'ai dû supprimer `(grave / backtick) entourant les références de nom de colonne.
secretwep le

5

Selon la base de données, vous pouvez exporter au format CSV, puis utiliser une méthode d'importation.

MySQL - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

PostgreSQL - http://www.postgresql.org/docs/8.2/static/sql-copy.html


3
MS SQL, vous pouvez utiliser l'assistant d'importation de SSMS pour importer un fichier Excel.
Hart CO

1
Pour ajouter des détails à @HartCO - Pour accéder à l'assistant d'importation SSMS, cliquez avec le bouton droit de la souris sur la base de données, survolez les tâches, cliquez sur "Importer des données ..." en bas du menu contextuel. Suivez les étapes de l'assistant.
qxotk

2

Vous pouvez utiliser VB pour écrire quelque chose qui sortira dans un fichier ligne par ligne en ajoutant les instructions sql appropriées autour de vos données. Je l'ai fait avant.


1

Voici un autre outil qui fonctionne très bien ...

http://www.convertcsv.com/csv-to-sql.htm

Il peut prendre des valeurs séparées par des tabulations et générer un script INSERT. Copiez et collez simplement et dans les options de l' étape 2, cochez la case "La première ligne correspond aux noms de colonnes"

Ensuite , faites défiler vers le bas et à l'étape 3, entrez le nom de votre table dans la case "Schema.Table or View Name:"

Faites également attention aux cases à cocher de suppression et de création de table, et assurez-vous d'examiner le script généré avant de l'exécuter.

C'est le moyen le plus rapide et le plus fiable que j'ai trouvé.


1

Utilisez le ConvertFrom-ExcelToSQLInsertdepuis ImportExcel dans la galerie PowerShell

NAME
    ConvertFrom-ExcelToSQLInsert
SYNTAX
    ConvertFrom-ExcelToSQLInsert [-TableName] <Object> [-Path] <Object> 
      [[-WorkSheetname] <Object>] [[-HeaderRow] <int>] 
      [[-Header] <string[]>] [-NoHeader] [-DataOnly]  [<CommonParameters>]
PARAMETERS
    -DataOnly
    -Header <string[]>
    -HeaderRow <int>
    -NoHeader
    -Path <Object>
    -TableName <Object>
    -WorkSheetname <Object>
    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).
ALIASES
    None
REMARKS
    None


0

Cette requête que j'ai générée pour insérer les données du fichier Excel dans la base de données Dans cet identifiant et le prix sont également des valeurs numériques et un champ de date. Cette requête résumait tout le type dont j'ai besoin Elle peut également vous être utile

="insert into  product (product_id,name,date,price) values("&A1&",'" &B1& "','" &C1& "'," &D1& ");"


    Id    Name           Date           price 
    7   Product 7   2017-01-05 15:28:37 200
    8   Product 8   2017-01-05 15:28:37 40
    9   Product 9   2017-01-05 15:32:31 500
    10  Product 10  2017-01-05 15:32:31 30
    11  Product 11  2017-01-05 15:32:31 99
    12  Product 12  2017-01-05 15:32:31 25

0

Vous pouvez utiliser la méthode C # ci-dessous pour générer les scripts d'insertion à l'aide de la feuille Excel, il vous suffit d'importer le package OfficeOpenXml à partir du gestionnaire de package NuGet avant d'exécuter la méthode.

public string GenerateSQLInsertScripts() {

        var outputQuery = new StringBuilder();
        var tableName = "Your Table Name";
        if (file != null)
        {
            var filePath = @"D:\FileName.xsls";

            using (OfficeOpenXml.ExcelPackage xlPackage = new OfficeOpenXml.ExcelPackage(new FileInfo(filePath)))
            {
                var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select the first sheet here
                var totalRows = myWorksheet.Dimension.End.Row;
                var totalColumns = myWorksheet.Dimension.End.Column;

                var columns = new StringBuilder(); //this is your columns

                var columnRows = myWorksheet.Cells[1, 1, 1, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());

                columns.Append("INSERT INTO["+ tableName +"] (");
                foreach (var colrow in columnRows)
                {
                    columns.Append("[");
                    columns.Append(colrow);
                    columns.Append("]");
                    columns.Append(",");
                }
                columns.Length--;
                columns.Append(") VALUES (");
                for (int rowNum = 2; rowNum <= totalRows; rowNum++) //selet starting row here
                {
                    var dataRows = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());

                    var finalQuery = new StringBuilder(); 
                    finalQuery.Append(columns);

                    foreach (var dataRow in dataRows)
                    {
                        finalQuery.Append("'");
                        finalQuery.Append(dataRow);
                        finalQuery.Append("'");
                        finalQuery.Append(",");
                    }
                    finalQuery.Length--;

                    finalQuery.Append(");");

                    outputQuery.Append(finalQuery);

                  }

            }
        }

return outputQuery.ToString();}


0

J'ai un moyen fiable de générer des insertions SQL par lots, et vous pouvez modifier des paramètres partiels dans le traitement.Cela m'aide beaucoup dans mon travail, par exemple, copier une centaine de données dans une base de données avec une structure incompatible et le nombre de champs. IntellIJ DataGrip , l'outil puissant que j'utilise. DG peut recevoir des données de WPS Office ou MS Excel par colonne ou ligne. après la copie, DG peut exporter des données sous forme d'insertions SQL .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.