I powershell använder jag foreach
för att köra en funktion genom en lista över mål.
Jag undrade att om det finns något som liknar foreach
i SQL, så att jag kan köra samma fråga genom flera DB: er som jag valde och spara resultaten till en csv-fil?
Kommentarer
- Det du gör kan också göras i powershell. Så varför använda tsql och sedan dumpa i en csv-fil?
- Jag försökte ha färre parter inblandade om jag bara kunde göra det från en källa.
Svar
Som Kin nämnde, medan du kan göra detta i T-SQL, är PowerShell fortfarande livskraftigt och potentiellt mycket enklare, särskilt när du använder dbatools .
Du kan använda Get-DbaDatabase
för att inte bara hämta databaser utan också enkelt filtrera bort problematiska som du förmodligen inte vill köra mot (system dbs, offline dbs, etc):
Get-DbaDatabase -Status "Normal" -ExcludeSystem -OnlyAccessible
Och kör sedan Invoke-DbaQuery
för att köra ditt kommando mot var och en av de returnerade databaserna.
Kommentarer
- Det här är jättebra! Jag måste verkligen komma på dbaTools.io-tåget. Förhoppningsvis snart!
- Jag slutar med
foreah ($db in $dbs ) {invoke-sqlcmd......}
Svar
Absolut. Vi har definitivt FOR-slingor.
https://www.techonthenet.com/sql_server/loops/for_loop.php
Från site:
DECLARE @cnt INT = 0; WHILE @cnt < cnt_total BEGIN {...statements...} SET @cnt = @cnt + 1; END;
Det finns också en ”FOREACHDB” -funktionalitet och till och med foreachTable
https://www.sqlservercentral.com/Forums/Topic271576-5-1.aspx https://stackoverflow.com/questions/26496864/how-to-loop-through-all-sql-tables
Men en hel del artiklar om varför det (foreachdb) kan vara opålitligt.
Här är en Aaron Bertrand-version, som är mycket bättre: https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/448
Detta är den direkta länken. https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/