In PowerShell utilizzo foreach
per eseguire una funzione attraverso un elenco di target.
Mi chiedevo se esiste qualcosa di simile a foreach
in sql, quindi posso eseguire la stessa query su più DB che ho scelto e salvare i risultati in un file csv?
Commenti
- Ciò che stai facendo può essere fatto anche in PowerShell. Allora perché usare tsql e poi eseguire il dump in un file csv?
- Stavo cercando di coinvolgere meno parti se potessi farlo da una sola fonte.
Answer
Come menzionato da Kin, anche se puoi farlo in T-SQL, PowerShell è ancora praticabile e potenzialmente molto più semplice, specialmente quando utilizzi dbatools .
Puoi utilizzare Get-DbaDatabase
non solo per ottenere i database, ma anche per filtrare facilmente quelli problematici su cui probabilmente non si desidera eseguire (database di sistema, database offline, ecc.):
Get-DbaDatabase -Status "Normal" -ExcludeSystem -OnlyAccessible
Quindi esegui Invoke-DbaQuery
per eseguire il comando su ciascuno dei database restituiti.
Commenti
- È fantastico! Ho davvero bisogno di salire sul treno dbaTools.io. Spero presto!
- Finisco con
foreah ($db in $dbs ) {invoke-sqlcmd......}
Risposta
Assolutamente. Abbiamo sicuramente i cicli FOR.
https://www.techonthenet.com/sql_server/loops/for_loop.php
Dal site:
DECLARE @cnt INT = 0; WHILE @cnt < cnt_total BEGIN {...statements...} SET @cnt = @cnt + 1; END;
Cè anche una funzionalità “FOREACHDB” e persino foreachTable
https://www.sqlservercentral.com/Forums/Topic271576-5-1.aspx https://stackoverflow.com/questions/26496864/how-to-loop-through-all-sql-tables
Ma alcuni articoli sul motivo per cui (foreachdb) potrebbe essere inaffidabile.
Ecco un Aaron Versione Bertrand, che è molto meglio: https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/448
Questo è il link diretto. https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/