web-dev-qa-db-fra.com

Astuces pour générer des instructions SQL dans Excel

Avez-vous des astuces pour générer des instructions SQL, principalement des INSERT, dans Excel pour divers scénarios d'importation de données?

Je suis vraiment fatigué d'écrire des formules avec comme

="INSERT INTO Table (ID, Name) VALUES (" & C2 & ", '" & D2 & "')"

18
David Vidmar

Le point-virgule doit être dans la dernière citation double avec un parenthèse fermante. Lorsque vous ajoutez des guillemets simples autour d'une chaîne, n'oubliez pas de les ajouter en dehors de la cellule sélectionnée.

(espaces ajoutés pour la visibilité - supprimer avant d'insérer)

=CONCATENATE("insert into table (id, name) values (",C2,",' ",D2," ');")

Voici une autre vue:

=CONCATENATE("insert into table (id, date, price) values (",C3,",'",D3,"',",B3,");")

31
Jason V

J'avais l'habitude d'utiliser la méthode de concaténation de chaînes pour créer des insertions SQL dans Excel. Cela peut bien fonctionner, mais cela peut aussi prendre un peu de temps et être fastidieux.

J'ai créé un complément Excel qui facilite la génération d'insertions à partir d'Excel:

(Voir la vidéo au bas de la page) http://www.howinexcel.com/2009/06/generating-sql-insert-statements-in-Excel.html

http://www.querycell.com/SQLGenerator.html

http://www.oneclickcommissions.com/Excel-statement.html

2
SamH

Parfois, j'utilise substitute pour remplacer des modèles dans la commande SQL au lieu d'essayer de générer la commande SQL à partir d'une concaténation. Disons que les données sont dans les colonnes A et B. Insérez une ligne supérieure. Dans la cellule C1, placez la commande SQL en utilisant le modèle:

insert into table t1 values('<<A>>', '<<B>>')

Ensuite, dans les lignes 2, placez la formule Excel:

=SUBSTITUTE(SUBSTITUTE($C$1, "<<A>>", A2), "<<B>>", B2)

Notez l'utilisation d'adressage de cellule absolu $C$1 pour obtenir le modèle. Particulièrement agréable lorsque vous travaillez avec char ou varchar et que vous devez mélanger les guillemets simples et doubles dans la concaténation. Comparer aux:

=concatenate("insert into table t1 values '", A2, "', '", B2, "')"

Une autre chose qui m’a mordue plus d’une fois est d’essayer d’utiliser Excel pour traiter certains caractères ou varchars qui sont numériques, sauf qu’ils ont des zéros non significatifs, tels que 007. Excel convertira le nombre 7.

2
Shannon Severance

l'approche VBA serait: déclarez votre chaîne et affectez votre instruction SQL comme ceci

dim SqlString as String
SqlString = "SELECT * FROM %1 WHERE (var=%2)"
SqlString = Replace("%1", "Table_Name")
SqlString = Replace("%2", ""value"")

L’approche Excel est similaire, mais elle utilise la fonction SUBSTITUTE.

Je préfère cette approche car elle rend le texte SQL lisible et évite tous les problèmes gênants et concaténés. Oui, il faut une cellule supplémentaire, mais cela en vaut la peine pour la piste de vérification.

1
Peter Carswell

Je connais cette douleur. J'ai fini par écrire sur mon blog ... deux fois .
J'ai créé un fichier UDF qui concatène une plage de cellules avec plusieurs options. Cela séparera toujours les valeurs par une virgule, mais ajoutera éventuellement des guillemets simples et/ou des parenthèses si nécessaire.

Donc, vous écrivez la partie facile de la déclaration SQL.

INSERT INTO table
VALUES /*string that we don't want to type by hand*/

ou 

SELECT *
FROM table
WHERE foo IN (/*another string I don't want to type out*/)

Et la fonction Excel personnalisée ci-dessous transformera les valeurs d'une plage de calcul en une chaîne Nice pour vous.

Function SQLConcat(rng As Range, Optional quoted As Boolean = False, Optional parenthesis As Boolean = False) As String
' ***************************************************************
' * Returns a comma separated list for use in SQL IN statements *
' * Params *
' * - rng: Range of cells to concatenate *
' * - quoted: True/False. If true, values are placed inside *
' * of single quotes. Default of false *
' * - parenthesis: Boolean. *
' * Useful for INSERT INTO tbl VALUES(53),(90),(397) *
' * *
' * Author: Christopher J. McClellan *
' * Published under Creative Commons Attribution-Share Alike *
' * http://creativecommons.org/licenses/by-sa/3.0/ *
' * You are free to change, distribute, and pretty much do *
' * whatever you like with the code, but you must give credit *
' * to the original author and publish any derivitive of this *
' * code under the same license. *
' ***************************************************************

Dim tmp As String 'temporary string
Dim row As Long 'first cell is special case
row = 0 'initalize row count
Dim c As Object 'cell
Dim txtwrapperLeft As String, txtwrapperRight As String

If quoted = True And parenthesis = False Then
 txtwrapperLeft = "'"
 txtwrapperRight = "'"
ElseIf quoted = True And parenthesis = True Then
 txtwrapperLeft = "('"
 txtwrapperRight = "')"
ElseIf quoted = False And parenthesis = True Then
 txtwrapperLeft = "("
 txtwrapperRight = ")"
Else
'quoted = false and parenthesis = false
 txtwrapperLeft = ""
 txtwrapperRight = ""
End If

For Each c In rng.Cells
 If row = 0 Then
 tmp = txtwrapperLeft & c.Value & txtwrapperRight
 Else
 tmp = tmp & "," & txtwrapperLeft & c.Value & txtwrapperRight
 End If
 row = row + 1
 Debug.Print tmp
Next c

'return
SQLConcat = tmp
End Function
1
RubberDuck

L'exportation d'un fichier Excel en tant que csv peut être une option alternative (voir l'article de Bill Krawin - en tant que nouvelle affiche, je ne peux pas encore ajouter de commentaire). Toutefois, sachez que vous devrez probablement modifier la mise en forme de vos champs de date en aaaa-mm-jj, sinon les colonnes de date afficheront toutes 00/00/00, car MySQL utilise une date différente de Microsoft Excel. Vous pouvez également utiliser OpenOffice pour enregistrer le fichier csv.

0
DBMarcos99

Pour l'insertion de données dans une table SQL 

=CONCATENATE("INSERT INTO `database_name`.`table_name`(`Column_Name`,`Column_Name`) VALUES ( '",A1,"',",B1,"); ")
0
Vivek Gajbhiye

Je faisais cela hier, et oui, il est agaçant d’obtenir les citations correctement. Une chose que j’ai faite est d’avoir une cellule nommée qui ne contient qu’une citation. Tapez dans A1 ="'" (égal, guillemet double, guillemet simple, guillemet double) puis nommez cette cellule "QUOTE" en tapant celle-ci dans la case située à gauche de la barre d'outils la plus basse.

0
WW.

Pourquoi ne pas interroger et insérer les données du classeur Excel dans la source à l'aide de SQL ACE/Jet (a.k.a. Access)? Cela nécessite un ACE/Jet qui pourrait être une autre feuille de calcul Excel. Voici un exemple rapide:

INSERT INTO 
   [ODBC;Driver={SQL Server};SERVER=MYSERVER;DATABASE=MyDatabase;UID=sa;Pwd=mypassword;].MyTable (ID, Name)
SELECT F1, F2
  FROM 
   [Excel 8.0;HDR=NO;IMEX=1;Database=C:\db.xls;].[Sheet1$A1:B4];
0
onedaywhen

Pourquoi générez-vous SQL dans Excel? Il est plus facile et beaucoup plus rapide d’exporter une feuille de calcul sous forme de fichier CSV, puis d’utiliser un outil pour importer ce fichier dans une base de données SQL. Par exemple, la commande LOAD DATA INFILE de MySQL.

Toutes mes excuses pour ne pas avoir répondu directement à votre question et je sais que ce n'est pas une solution pour toutes les circonstances.

0
Bill Karwin

Parfois, la construction d’insertions SQL semble être le moyen le plus simple. Mais vous en avez assez vite, et je ne pense pas qu'il existe des moyens "intelligents" de le faire (à part peut-être une programmation macros/VBA).

Je vous suggère d'éviter Excel et d'explorer d'autres idées:

  • utilisez Access (excellent filtre d'importation csv, puis créez un lien vers la table de base de données et laissez Access se charger de l'insertion)
  • utilisez TOAD (fonctionnalité d'importation encore meilleure car elle vous permet de mélanger et de faire correspondre des colonnes, et même d'importer à partir du presse-papiers)
  • utiliser SQL Loader (un peu délicat à utiliser, mais rapide et assez flexible).
0
Thorsten