PowerShell: Datenbanknamen als Dateinamen auslesen

23. Dezember 2014 11:19

Mit dieser Funktion kann man über das SQL Server Management Studio die Datenbanknamen als Dateinamen in einem Indexordner anlegen, um damit Stapelverarbeitungen durchführen zu können.
Anwendungsfälle sind z.B. Objektstapelimporte oder Compilerläufe.

Hiermit können dann die betroffenen Datenbanken für die jeweilig anstehenden Stapelverarbeitungen schnell zusammengestellt werden.
So sieht die Datenbankliste für den im Beispiel verwendeten Server bei mir lokal aus:
ExtractDatabaseNames4.png

Die Systemdatenbanken und einige andere "Spielwiesen" sollen dabei übergangen werden, damit nur die relevanten Datenbanknamen berücksichtigt werden.

In der Powershell wechselt man in den Ordner, der nach Ausführung die Dateinamen enthalten soll, und ruft dann die Funktion mitsamt dem Servernamen auf.

ExtractDatabaseNames1.png


Der Servername wird dabei in die automatische $args-Variable übergeben.
Accepting Arguments for PowerShell Functions: Best Practices

In der Beispielfunktion werden die Datenbanknamen über
Code:
$filename.StartsWith('NAV'))

gefiltert, hier kann man nach Bedarf die eigenen Filter anwenden.
Andere Möglichkeiten an dieser Stelle wären z.B.
  • $filename.Substring
  • $filename.Contains
  • $filename.EndsWith

Ausgabe zur Laufzeit, angezeigt werden alle Datenbanknamen, als Datei angelegt werden nur die gefilterten, hier alle die mit "NAV" beginnen.
ExtractDatabaseNames2.png

Ausschnitt aus den durch die Funktion angelegten Dateien im aktuellen Ordner.
ExtractDatabaseNames3.png


Funktionscode
ExtractDatabaseNamesFunction.png


Code:
function ExtractNAVDatabaseNames
{
    #Connect and run a command using SMO
    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
    #  $args = Servername
   $sqlServer = new-object ("Microsoft.SqlServer.Management.Smo.Server") $args
    foreach($sqlDatabase in $sqlServer.databases)
    {
    $sqlDatabase.name
    $filename = $sqlDatabase.name.ToString()
    # use own filtering here
    if  ($filename.StartsWith('NAV'))
      {New-Item $filename -type file -force}
    }
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.