Πώς μπορούμε να εκτελέσουμε πολλαπλά SQL Scripts στον SQL Server μέσα από τα Windows με batch script
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Σε αυτό το άρθρο θα δούμε έναν εύκολο τρόπο για να μπορούμε να εκτελέσουμε μαζικά SQL Scripts στον SQL Server με batch script και να κρατήσουμε ξεχωριστά τα αποτελέσματα για το καθένα σε CSV.
Το παράδειγμα
Έστω ότι έχουμε πολλαπλά scripts που θέλουμε να τρέξουν στη βάση AdventureWorks2019 και κάποια στην StackOverflow2013.
Το μόνο που χρειάζεται να έχουμε κάνει σαν προετοιμασία είναι, να τα έχουμε βάλει το κάθε script σε φάκελο που θα έχει το όνομα της βάσης που θέλουμε να τρέξει ανά περίπτωση και να τα έχουμε ονομάσει με αριθμό στην αρχή έτσι ώστε να είναι σε σειρά:
Μέσα στον φάκελο με το όνομα της βάσης που περιέχει τα scripts προσθέτουμε και το batch script (sqlcmd_batch_script.cmd) που θα δούμε παρακάτω τι πρέπει να περιέχει:
Στο πρώτο script για το παράδειγμα ζητάμε να μας φέρει το όνομα του server, το όνομα της βάσης και τους πίνακες που περιέχει:
Τώρα με διπλό κλικ στο batch script (sqlcmd_batch_script.cmd) θα μας εμφανιστεί το command window και θα δούμε να εκτελεί ένα ένα τα scripts με sqlcmd:
Όταν ολοκληρωθεί θα δούμε ότι στον ίδιο φάκελο θα έχει εξάγει σε CSV ξεχωριστά τα αποτελέσματα για το καθένα:
Αν ανοίξουμε το πρώτο CSV με τα αποτελέσματα του πρώτου script, θα δούμε ότι μας αποθήκευσε τα αποτελέσματα του select που ζητήσαμε με το server name, το όνομα της βάσης και τους πίνακες που περιέχει:
Ο κώδικας
Ας δούμε τώρα βήμα βήμα τι πρέπει να περιέχει το batch script (sqlcmd_batch_script.cmd) και τι παραμέτρους ορίζουμε.
Για αρχή κρατάμε το full path για κάθε αρχείο που υπάρχει στον φάκελο και ορίζουμε την μεταβλητή dbname να πάρει το όνομα του φακέλου (που θα είναι το ίδιο με το όνομα της βάσης που θέλουμε να τρέξει):
CD /d "%~dp0"
for %%I in (.) do set dbname=%%~nI
Στη συνέχεια ορίζουμε το τύπο του αρχείου που θέλουμε να εξαχθούν τα αποτελέσματα και τον delimiter που θέλουμε να έχει. Στην περίπτωση μας, διαλέγουμε CSV και comma για delimiter ώστε όταν το ανοίξουμε να είναι ήδη χωρισμένο σε κολώνες:
set filetype=.csv
set delimiter=,
Στο επόμενο βήμα ορίζουμε το όνομα του server με την πόρτα, το username και τo password με το οποίο θα τρέξει (αν κάναμε χρήση Active Directory login θα έπρεπε οι παράμετροι user και pass να έχουν αφαιρεθεί):
set instance=SMATZOURANISLP,1433
set user=stratos
set pass=password
Μπορούμε στο script να έχουμε και δεύτερο instance και να τρέχει στο ανάλογο instance αναλόγως το όνομα της βάσης:
set instance2=SMATZOURANISLP\INSTANCE2,1533
set user2=stratos
set pass2=password
Σε αυτή τη περίπτωση ορίζουμε πότε θα συνδεθεί στο πρώτο instance και πότε στο δεύτερο:
IF "%dbname%"=="StackOverflow2013" GOTO instance1
IF "%dbname%"=="AdventureWorks2019" GOTO instance1
IF "%dbname%"=="StackOverflow2016" GOTO instance2
GOTO End1
Ανάλογα λοιπόν θα πάει στο κομμάτι του κώδικα για το instance1:
:instance1
for %%G in (*.sql) do sqlcmd /S "%instance%" /d "%dbname%" -U "%user%" -P "%pass%" -i"%%G" -b -s"%delimiter%" -W -o "%%G%filetype%"
GOTO End1
ή το instance2:
:instance2
for %%G in (*.sql) do sqlcmd /S "%instance2%" /d "%dbname%" -U "%user2%" -P "%pass2%" -i"%%G" -b -s"%delimiter%" -W -o "%%G%filetype%"
GOTO End1
:End1
pause
Ο κώδικας του script όλος μαζί
Στο τέλος το batch script (sqlcmd_batch_script.cmd) θα πρέπει να έχει αυτή τη μορφή:
CD /d "%~dp0" for %%I in (.) do set dbname=%%~nI set filetype=.csv set delimiter=, set instance=SMATZOURANISLP,1433 set user=stratos set pass=password set instance2=SMATZOURANISLP\INSTANCE2,1533 set user2=stratos set pass2=password IF "%dbname%"=="StackOverflow2013" GOTO instance1 IF "%dbname%"=="AdventureWorks2019" GOTO instance1 IF "%dbname%"=="StackOverflow2016" GOTO instance2 GOTO End1 :instance1 for %%G in (*.sql) do sqlcmd /S "%instance%" /d "%dbname%" -U "%user%" -P "%pass%" -i"%%G" -b -s"%delimiter%" -W -o "%%G%filetype%" GOTO End1 :instance2 for %%G in (*.sql) do sqlcmd /S "%instance2%" /d "%dbname%" -U "%user2%" -P "%pass2%" -i"%%G" -b -s"%delimiter%" -W -o "%%G%filetype%" GOTO End1 :End1 pause