Comment ajouter des données de SQL à un fichier existant
-
13-10-2019 - |
Question
SQL a la possibilité de vider les données dans un fichier, en utilisant l'option INTO OUTFILE, pour exmaple
SELECT * from FIshReport INTO OUTFILE './FishyFile'
Le problème est, cette commande est autorisée que si le fichier n'existait pas avant lui. Il crée le fichier et entre ensuite les données. Alors, est-il possible d'ajouter des données à un fichier de cette façon?
La solution
Comme la page de MySQL sur la syntaxe SELECT indique:
http://dev.mysql.com/doc/refman/ 5.0 / fr / select.html
l'alternative à cela est d'émettre la commande SELECT du client MySQL:
However, if the MySQL client software is installed on the remote machine,
you can instead use a client command such as mysql -e "SELECT ..." > file_name
to generate the file on the client host.
qui, dans votre cas, serait modifié pour être:
mysql -e "SELECT * from FishReport" >> file_name
afin que vous accoler au fichier.
A partir de votre script Tcl, vous pouvez simplement donner cela comme une commande exec:
Autres conseils
Je pense que MySQL ne permet pas l'ajout de données à un fichier existant ou écraser un fichier existant pour des raisons de sécurité. A autour de travail pourrait être de sauver resuts dans des fichiers séparés, puis append le fichier en utilisant IO.
Vous pouvez toujours ajouter la sortie de votre script SQL dans un fichier en utilisant >>
Par exemple (pour Sybase):
isql < script.sql >> outputfile.out
Je ne peux pas vous dire ce que l'équivalent est de MySQL, mais le principe devrait être le même.
Sortie cours vont tous à un fichier si votre script SQL est la sortie SQL différentes sélectionne à différents fichiers de sortie, vous aurez besoin de diviser le script vers le haut.
Vous pouvez tout simplement l'ajouter à une variable. Ensuite, utilisez un SELECT avec UNION.
declare t varchar(100);
set @myvar = concat('
select * INTO OUTFILE \'',file,'\'
from (
select \'',t,'\'
union all
SELECT col from tbl where x
) a'
);
PREPARE stmt1 FROM @myvar;
EXECUTE stmt1;
Deallocate prepare stmt1;