foreach loop i sql-skript?

I powershell bruker jeg foreach for å kjøre en funksjon gjennom en liste over mål.

Jeg lurte på at hvis det er noe som ligner på foreach i sql, så kan jeg kjøre den samme forespørselen gjennom flere DB-er jeg valgte og lagre resultatene i en csv-fil?

Kommentarer

  • Det du gjør kan også gjøres i powershell. Så hvorfor bruke tsql og deretter dumpe til en csv-fil?
  • Jeg prøvde å ha færre involverte parter hvis jeg bare kunne gjøre det fra en kilde.

Svar

Som Kin nevnte, mens du kan gjøre dette i T-SQL, er PowerShell fortsatt levedyktig og potensielt mye lettere, spesielt når du utnytter dbatools .

Du kan bruke Get-DbaDatabase for ikke bare å hente databasene, men også enkelt filtrere ut problematiske dem du sannsynligvis ikke vil utføre mot (system dbs, offline dbs, etc):

Get-DbaDatabase -Status "Normal" -ExcludeSystem -OnlyAccessible 

Kjør deretter Invoke-DbaQuery for å kjøre kommandoen din mot hver av de returnerte databasene.

Kommentarer

  • Dette er flott! Jeg trenger virkelig å komme meg på dbaTools.io-toget. Forhåpentligvis snart!
  • Jeg ender opp med foreah ($db in $dbs ) {invoke-sqlcmd......}

Svar

Absolutt. Vi har definitivt FOR-løkker.

https://www.techonthenet.com/sql_server/loops/for_loop.php

Fra site:

DECLARE @cnt INT = 0; WHILE @cnt < cnt_total BEGIN {...statements...} SET @cnt = @cnt + 1; END; 

Det er også en «FOREACHDB» -funksjonalitet og til og med foreachTable

https://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/

https://www.sqlservercentral.com/Forums/Topic271576-5-1.aspx https://stackoverflow.com/questions/26496864/how-to-loop-through-all-sql-tables

Men ganske mange artikler om hvorfor det (foreachdb) kan være upålitelig.

Her er en Aaron Bertrand-versjonen, som er mye bedre: https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/448

Dette er den direkte lenken. https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *