En powershell, uso foreach
para ejecutar una función a través de una lista de objetivos.
Me preguntaba si hay algo similar a foreach
en sql, para poder ejecutar la misma consulta a través de varios DB que elegí y guardar los resultados en un archivo csv.
Comentarios
- Lo que estás haciendo también se puede hacer en PowerShell. Entonces, ¿por qué usar tsql y luego volcarlo en un archivo csv?
- Estaba tratando de tener menos partes involucradas si podía hacerlo desde una sola fuente.
Respuesta
Como mencionó Kin, aunque puede hacer esto en T-SQL, PowerShell sigue siendo viable y potencialmente mucho más fácil, especialmente cuando aprovecha dbatools .
Puede usar Get-DbaDatabase
no solo para obtener las bases de datos, sino también para filtrar fácilmente aquellas problemáticas contra las que probablemente no desee ejecutar (dbs del sistema, dbs sin conexión, etc.):
Get-DbaDatabase -Status "Normal" -ExcludeSystem -OnlyAccessible
Y luego ejecute Invoke-DbaQuery
para ejecutar su comando en cada una de las bases de datos devueltas.
Comentarios
- ¡Esto es genial! Realmente necesito subirme al tren dbaTools.io. ¡Ojalá pronto!
- Termino con
foreah ($db in $dbs ) {invoke-sqlcmd......}
Responder
Por supuesto. Definitivamente tenemos bucles FOR.
https://www.techonthenet.com/sql_server/loops/for_loop.php
De la site:
DECLARE @cnt INT = 0; WHILE @cnt < cnt_total BEGIN {...statements...} SET @cnt = @cnt + 1; END;
También hay una funcionalidad «FOREACHDB» e incluso foreachTable
https://www.sqlservercentral.com/Forums/Topic271576-5-1.aspx https://stackoverflow.com/questions/26496864/how-to-loop-through-all-sql-tables
Pero bastantes artículos sobre por qué (foreachdb) puede no ser confiable.
Aquí está un Aaron Versión de Bertrand, que es mucho mejor: https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/448
Este es el enlace directo. https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/