No PowerShell, eu uso foreach
para executar uma função por meio de uma lista de destinos.
Gostaria de saber se existe algo semelhante a foreach
no sql, para que eu possa executar a mesma consulta por meio de vários bancos de dados que escolhi e salvar os resultados em um arquivo csv?
Comentários
- O que você está fazendo também pode ser feito no PowerShell. Então por que usar tsql e depois despejar em um arquivo csv?
- Eu estava tentando ter menos partes envolvidas se pudesse fazer isso de apenas uma fonte.
Resposta
Como o Kin mencionou, embora você possa fazer isso em T-SQL, o PowerShell ainda é viável e potencialmente muito mais fácil, especialmente quando você utiliza dbatools .
Você pode usar Get-DbaDatabase
para não apenas obter os bancos de dados, mas também filtrar facilmente aqueles problemáticos nos quais você provavelmente não deseja executar (banco de dados do sistema, banco de dados offline, etc):
Get-DbaDatabase -Status "Normal" -ExcludeSystem -OnlyAccessible
E então execute Invoke-DbaQuery
para executar seu comando em cada um dos bancos de dados retornados.
Comentários
- Isso é ótimo! Eu realmente preciso entrar no trem dbaTools.io. Espero que em breve!
- Acabo com
foreah ($db in $dbs ) {invoke-sqlcmd......}
Resposta
Absolutamente. Definitivamente, temos loops FOR.
https://www.techonthenet.com/sql_server/loops/for_loop.php
Do site:
DECLARE @cnt INT = 0; WHILE @cnt < cnt_total BEGIN {...statements...} SET @cnt = @cnt + 1; END;
Há também uma funcionalidade “FOREACHDB” e até mesmo foreachTable
https://www.sqlservercentral.com/Forums/Topic271576-5-1.aspx https://stackoverflow.com/questions/26496864/how-to-loop-through-all-sql-tables
Mas alguns artigos sobre por que (foreachdb) pode não ser confiável.
Aqui está um Aaron Versão Bertrand, que é muito melhor: https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/448
Este é o link direto. https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/