foreach loop i sql-scripts?

I powershell bruger jeg foreach til at køre en funktion gennem en liste over mål.

Jeg spekulerede på, at hvis der er noget, der ligner foreach i sql, så jeg kan køre den samme forespørgsel gennem flere DBer, jeg valgte, og gemme resultaterne i en csv-fil?

Kommentarer

  • Det, du laver, kan også gøres i powershell. Så hvorfor bruge tsql og derefter dumpe i en csv-fil?
  • Jeg forsøgte at have færre involverede parter, hvis jeg kun kunne gøre det fra en kilde.

Svar

Som Kin nævnte, mens du kan gøre dette i T-SQL, er PowerShell stadig levedygtig og potentielt meget lettere, især når du udnytter dbatools .

Du kan bruge Get-DbaDatabase for ikke kun at få databaserne, men også nemt at filtrere problematiske dem ud, som du sandsynligvis ikke vil udføre mod (system dbs, offline dbs osv.):

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

Og kør derefter Invoke-DbaQuery for at køre din kommando mod hver af de returnerede databaser.

Kommentarer

  • Dette er fantastisk! Jeg har virkelig brug for at komme på dbaTools.io-toget. Forhåbentlig snart!
  • Jeg ender med foreah ($db in $dbs ) {invoke-sqlcmd......}

Svar

Absolut. Vi har bestemt FOR-sløjfer.

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; 

Der er også en “FOREACHDB” -funktionalitet og endda 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 artikler om, hvorfor det (foreachdb) kan være upålideligt.

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

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *