Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

comment enregistrer les procédures stockées SQL dans des fichiers .sql via batch

Créez un fichier de commandes avec un script (désolé pour le formatage, mais il devrait vraiment être en ligne pour exécuter le lot) :

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql"

Nommez-le "run.bat". Maintenant, pour exécuter le batch, utilisez params :
run.bat [username] [password] [servername] [database]
sur exemple :
run.bat sa pwd111 localhost\SQLEXPRESS master
Tout d'abord, tous les noms de procédures stockées seront stockés dans le fichier sp_list.txt, puis un par un dans des fichiers de script séparés. Le seul problème - la dernière ligne de chaque script avec le nombre de résultats - j'y travaille :)

modifié :bug dans la requête corrigé

Suppression de la ligne "Lignes affectées"
Ok, nous devons maintenant créer un lot supplémentaire :

type %1 | findstr /V /i %2  > xxxtmpfile 
copy xxxtmpfile %1 /y /v
del xxxtmpfile

Nommez-le "line_del.bat". Voir, le premier paramètre est le fichier à traiter, le 2ème - la chaîne pour rechercher les lignes à supprimer. Modifiez maintenant le lot principal (encore une fois, désolé pour le formatage) :

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"

Voir les articles associés :
Commandes de programmation simples dans un environnement batch
Utilitaire osql
MSSQL : Comment scriptez-vous la création d'une procédure stockée avec du code ?
Supprimer certaines lignes d'un fichier txt via un fichier batch

:) vous remarquerez peut-être que les deux derniers sont de SO !