Das ist eine für den Ausdruck optimierte Ansicht des gesamten Kapitels inkl. Unterseiten. Druckvorgang starten.

Zur Standardansicht zurückkehren.

Tools für Business Central und RELion

Hilfreiche Tools für Business Central und RELion

In diesem Bereich finden Sie hilfreiche Tools, die Sie in der Konfiguration und Wartung sowie der Entwicklung von RELion unterstützen.

1 - Export von Tabellendaten per PowerShell und SQL

Exportieren Sie Daten von beliebigen Tabellen direkt aus dem SQL Server mittels PowerShell.

Allgemein

Dieses PowerShell Skript exportiert Daten aus einer beliebigen Tabelle direkt aus dem SQL Server einer Business Central Datenbank. Für die Ausführung ist keine Business Central Installation notwendig. Bei Tabellen, die ihre Daten mandantenabhängig speichern, können die Daten aller Mandanten ausgegeben werden.

Die Daten werden als CSV-Datei ausgegeben.

Voraussetzungen

  • Die Datenbank muss auf einem SQL-Server bereitgestellt sein.
  • Es muss Zugriff auf den SQL-Server bestehen. Die Berechtigungen zur Anmeldung und zum Lesen der gewünschten Daten müssen vorhanden sein.
  • Es müssen PowerShell-Skripte ausgeführt werden können.
  • Das PowerShell Modul für den SQL-Server muss installiert sein.

Disclaimer

  • Das Skript darf frei verwendet werden.
  • Es wird keine Garantie für Funktionalität, Sicherheit oder Eignung gegeben.
  • Der Nutzer trägt die volle Verantwortung für die Verwendung.

Die Benutzung erfolgt auf eigene Gefahr!

Abhängig von der Größe/Menge der zu exportierenden Daten, benötigt das Skript möglicherweise sehr viel Arbeitsspeicher auf dem auführenden Rechner.

Skript

Parameter:

  • $Server: Netzwerk-Adresse/Name des Datenbank-Server
  • $DatabaseName: Datenbankname
  • $ResultFileName = Pfad und Name der Datei mit den Ergebnissen
  • $TableName = Name der Tabelle ohne Mandant
    • z.B. BC Tabelle Change Log
    • SQL-Tabellenname: Mandant 01$Change Log Entry$437dbf0e-84ff-417a-965d-ed2bb9650972
    • $TableName: Change Log Entry$437dbf0e-84ff-417a-965d-ed2bb9650972
    • Eine Liste der vorhandenen Tabellen kann z.B. über das SQL Managment Studio angezeigt werden.
  • $BaseQuery: SQL Statement zum Abrufen der gewünschten Inhalte
    • Alle Inhalte abrufen: SELECT * FROM
    • Nur die Anzahl der Datensätze abrufen: SELECT Count(timestamp) AS Count FROM

Der Servername, Datenbankname und der Mandant (bei mandantenabhängigen Tabellen) wird immer mit ausgegeben.

<#
    This script is provided "as is" and may be freely used, modified, and distributed.
    However, no warranty is given, either express or implied, including but not limited to
    warranties of merchantability or fitness for a particular purpose.
    Use at your own risk!
#>

# Define server/database
$Server = "<Server>"
$DatabaseName = "<DateBase>"

$ResultFileName = "Results.csv"

$TableName = 'Change Log Entry$437dbf0e-84ff-417a-965d-ed2bb9650972'
# Use this query to export all columns/rows
$BaseQuery = "SELECT * FROM"
# Use this query to count rows
# $BaseQuery = "SELECT Count(timestamp) AS Count FROM"

[switch]$UseExtensionTable
[switch]$DataPerCompany = $true
$TableString = if($UseExtensionTable){
   "[$TableName] NATURAL JOIN [$TableName`$ext]"
}
else {
   "[$TableName]"
}


$results = @()

# Update outer progress
Write-Progress -Id 1 `
    -Activity "Processing database" `
    -Status "$Server\$DatabaseName"

try {
    $Query = "$BaseQuery [$DatabaseName].[dbo].$TableString"
    if($DataPerCompany){
        Write-Host "Getting Companies"
        # Determine if the table is global or per company
        # Get First CompanyName
        $QueryString = "SELECT Name FROM Company;"
        $result = Invoke-Sqlcmd -ServerInstance $Server -Database $DatabaseName -Query $QueryString
        $Companies = $result.Name
        $QueryString = ""
        $i = 0
        foreach($Company in $Companies){
            $i++
            Write-Progress -Id 2 `
                -Activity "Processing companies" `
                -Status "[$i] $Company"
            
            $SafeCompanyName = $Company.Replace("/","_").Replace(".","_")
            $QueryString = $Query.Replace($TableName, ("$SafeCompanyName`$$TableName"))

            Write-Host "Executing query on $server\$DatabaseName..." -ForegroundColor Cyan
            Write-Host $QueryString
            $result = Invoke-Sqlcmd -ServerInstance $server -Database $DatabaseName -Query $QueryString
            Write-Host "Result from $server\$DatabaseName" -ForegroundColor Green
            $result | Add-Member -MemberType NoteProperty -Name "Database" -Value $DatabaseName
            $result | Add-Member -MemberType NoteProperty -Name "Server" -Value $Server
            $result | Add-Member -MemberType NoteProperty -Name "Company" -Value $Company
            $results += $result
        }
        Write-Progress -Id 2 -Activity "Processing companies" -Completed
    }
    else {
        $QueryString = $Query

        Write-Host "Executing query on $server\$DatabaseName..." -ForegroundColor Cyan
        Write-Host $QueryString
        $result = Invoke-Sqlcmd -ServerInstance $server -Database $DatabaseName -Query $QueryString
        Write-Host "Result from $server\$DatabaseName" -ForegroundColor Green
        $result | Add-Member -MemberType NoteProperty -Name "Database" -Value $DatabaseName
        $result | Add-Member -MemberType NoteProperty -Name "Server" -Value $Server
        $results += $result        
    }
} catch {
    Write-Warning "Failed to execute query on $server\$DatabaseName`: $_"
}

Write-Progress -Id 1 -Activity "Processing databases" -Completed

Write-Host "Exporting results to $ResultFileName..." -ForegroundColor Cyan
$results | Export-Csv $ResultFileName -Delimiter ";" -NoTypeInformation
write-Host "Results exported" -ForegroundColor Green