foreach-slinga i SQL-skript?

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.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 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/

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *