38 votes

Comment exécuter plusieurs instructions SQL dans l'éditeur de requêtes d'Access ?

J'ai un fichier texte contenant quelques instructions SQL que je veux exécuter sur une base de données Access. sur une base de données Access. Je pensais que cela devait être possible avec l'éditeur de requêtes d'Access. éditeur de requêtes d'Access. Je vais donc dans cet éditeur et je colle les instructions :

insert into aFewYears (yr) values ('2000')
insert into aFewYears (yr) values ('2001')
insert into aFewYears (yr) values ('2002')
insert into aFewYears (yr) values ('2003')

En essayant de les exécuter (en appuyant sur le point d'exclamation rouge) je reçois un
Missing semicolon (;) at end of SQL statement.

Cela pourrait être considéré comme une indication que l'éditeur permet d'exécuter des plusieurs déclarations. Donc, je modifie les instructions et ajoute un tel point-virgule à la fin :

insert into aFewYears (yr) values ('2000');
insert into aFewYears (yr) values ('2001');
insert into aFewYears (yr) values ('2002');
insert into aFewYears (yr) values ('2003');

Ensuite, je reçois un
Characters found after end of SQL statement.
ce qui pourrait probablement être pris comme une indication qu'il n'est pas possible d'exécuter des déclarations multiples.

Ok, donc la question est la suivante : est-il possible d'exécuter plusieurs instructions dans l'éditeur de requêtes ? l'éditeur de requêtes, ou est-il possible d'exécuter par lot des instructions sql dans un fichier fichier dans/sur/contre Access.

Merci / René

modifier Les instructions d'insertion ont été utilisées à titre d'exemple et je me rends compte qu'elles sont loin d'être parfaites, parce qu'elles vont toutes à la même table et qu'une telle chose peut évidemment être résolue d'une manière ou d'une autre en utilisant une instruction qui a une union ou autre. Dans le cas que j'essaie de résoudre, le fichier contient non seulement des instructions d'insertion, mais aussi des instructions de création de table et des instructions d'insertion avec différentes tables sous-jacentes. J'espérais donc (et j'espère toujours) qu'il existe quelque chose comme mon bien-aimé SQL*Plus for Oracle qui peut exécuter un fichier contenant toutes sortes d'instructions SQL.

0 votes

En utilisant l'éditeur de requêtes LINQPad, nous pouvons exécuter des requêtes multiples en ajoutant Go après chaque déclaration

31voto

Albert D. Kallal Points 8087

Vous pouvez facilement écrire un code binaire qui lira un fichier. Vous pouvez soit supposer qu'il y a une instruction sql par ligne, soit supposer que l'instruction ;

Donc, en supposant que vous avez un fichier texte tel que :

insert into tblTest (t1) values ('2000');

update tbltest set t1 = '2222'
       where id = 5;

insert into tblTest (t1,t2,t3) 
       values ('2001','2002','2003');

Notez que dans le fichier texte ci-dessus, nous sommes libres d'avoir des instructions sql sur plus d'une ligne.

le code que vous pouvez utiliser pour lire + exécuter le script ci-dessus est :

Sub SqlScripts()

   Dim vSql       As Variant
   Dim vSqls      As Variant
   Dim strSql     As String
   Dim intF       As Integer

   intF = FreeFile()
   Open "c:\sql.txt" For Input As #intF
   strSql = input(LOF(intF), #intF)
   Close intF
   vSql = Split(strSql, ";")

   On Error Resume Next
   For Each vSqls In vSql
      CurrentDb.Execute vSqls
   Next

End Sub

Vous pourriez ajouter un message d'erreur si la déclaration unique ne fonctionne pas, par exemple

if err.number <> 0 then
   debug.print "sql err" & err.Descripiton & "-->" vSqls
end dif

Quoi qu'il en soit, le split() et la lecture de chaîne ci-dessus permettent à votre SQL d'être sur plus d'une ligne...

1 votes

Pourquoi utiliser une variable de type Variant ? Juste pour éviter d'utiliser un compteur et UBound() ? Quand j'ai vu ça pour la première fois, j'ai pensé que ça ressemblait au code d'un réfugié non-Access, et puis je vois que c'est de toi, Albert. Je ne le ferais jamais de cette façon. Je divise des chaînes de caractères, donc le tableau devrait être de type chaîne de caractères, à mon avis.

1 votes

@David W. Fenton -- "Pourquoi utiliser une variable de type Variant ?" -- parfois VBA ne vous donne pas beaucoup de choix en la matière et ceci est l'un d'entre eux. L'avantage d'utiliser Split et For Each est que le code est, selon moi, plus lisible... mais c'est une question de goût. Je remarque que vous omettez le plus souvent les mots-clés ByVal/ByRef, ce qui donne un ByRef implicite alors qu'un ByVal explicite serait plus approprié. Mais c'est juste une question de goût, pas de problème.

1 votes

Oui pour chaque signifie que je n'utilise pas la commande ubound(). Cela évite aussi de déclarer un compteur pour la boucle for/next. Je trouve qu'il y a un peu moins de frappe et je n'ai pas besoin d'utiliser un tableau de références comme vSql(I) . Et aussi, à la place de "Next I" je peux utiliser : "Next" (ainsi je peux changer la variable utilisée mais et moins d'autres endroits du code affectés si vous renommez la var utilisée). La variable "for each" doit être une variante, mais le tableau (comme Dave le souligne) aurait dû être déclaré comme un tableau de chaînes de caractères Dim vSql() As String

16voto

phoebus Points 7358

Malheureusement, à ma connaissance, vous ne pouvez pas exécuter plusieurs instructions SQL sous une seule requête nommée dans Access au sens traditionnel du terme.

Vous pouvez faire plusieurs requêtes, puis les enchaîner avec VBA ( DoCmd.OpenQuery si ma mémoire est bonne).

Vous pouvez également enchaîner un ensemble de choses avec UNION si vous le souhaitez.

2voto

Gilberto Pe-Curto Points 199

Il vaut mieux créer un fichier XLSX avec les noms des champs sur la première ligne. Créez-le manuellement ou en utilisant Mockaroo. Exportez-le vers Excel (ou CSV) et importez-le ensuite dans Access en utilisant Nouvelle source de données -> Depuis le fichier.

À mon avis, c'est la meilleure façon de procéder en Access, et la plus performante.

0 votes

Je ne peux pas éditer les fichiers XLXS avec vim, donc ce n'est pas une option pour moi.

0 votes

@RenéNyffenegger vous pouvez utiliser des csv - mais pourquoi avez-vous Access mais pas Excel ? pourquoi pas un SGBD "complet" ?

1voto

Ben Points 845

"J'espérais (et j'espère toujours) qu'il existe quelque chose comme mon cher SQL*Plus pour Oracle qui peut exécuter un fichier avec toutes sortes de déclarations SQL."

Si vous recherchez un programme simple capable d'importer un fichier et d'exécuter les instructions SQL qu'il contient, jetez un coup d'oeil à DBWConsole (freeware). Je l'ai utilisé pour traiter des DDL scripts (schéma de table) ainsi que des requêtes d'action. Il ne renvoie pas de jeux de données, il n'est donc pas utile pour les requêtes SELECT. Il supporte les commentaires d'une seule ligne préfixés par -- mais pas les commentaires de plusieurs lignes enveloppés dans /* */. Il supporte les paramètres de ligne de commande.

enter image description here

Si vous voulez une interface utilisateur interactive comme Oracle SQL Developer ou SSMS for Access, alors la référence de Matthew Lock à WinSQL est ce que vous devriez essayer.

0voto

masoud Cheragee Points 27

Créer une macro comme celle-ci

Base de données d'Option Compare

Sous a()

DoCmd.RunSQL "DELETE * from TABLENAME where CONDITIONS" (Supprimer * de TABLENAME où CONDITIONS)

DoCmd.RunSQL "DELETE * from TABLENAME where CONDITIONS" (Supprimer * de TABLENAME où CONDITIONS)

End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X