Functions/CreateViews.ps1

function CreateViews {
    $Instance = GetActiveInstance -LoadModules
    Write-Host "Reading Configuration for $Instance" -ForegroundColor Green
    $Config = Get-NAVServerConfiguration -ServerInstance $Instance

    $ConfigHash = @{}

    $Config.ForEach({ $ConfigHash[$_.key] = $_.value })

    $SQLDB = $ConfigHash['Database']
    $SQLServer = $ConfigHash['DatabaseServer']
    $SQLInstance = $ConfigHash['DatabaseInstance']
    if ($SQLInstance) {
        $SQLServer = "$SQLServer\$SQLInstance"
    }
    Write-Host "Connecting to $SQLDB on $SQLServer" -ForegroundColor Green

    Write-Host "Getting list of tables" -ForegroundColor Green
    $Tables = Invoke-SqlCmd -ServerInstance $SQLServer -Database $SQLDB -Query "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME like '%`$ext'" -Encrypt Optional
    foreach ($Table in $Tables) {
        $TableName = $Table.TABLE_NAME
        if ($TableName -match '^(.+)\$([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})\$ext') {
            $SQLTableName = $Matches[1]
            Write-Host "Getting columns for table $TableName" -ForegroundColor Green
            $Columns = Invoke-SqlCmd -ServerInstance $SQLServer -Database $SQLDB -Query "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$TableName'" -Encrypt Optional
            $Apps = @{}
            
            foreach ($Column in $Columns) {
                $ColumnName = $Column.COLUMN_NAME
                if ($ColumnName -match '^(.+)\$([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})$') {
                    Write-Host "Adding app $($Matches[2]) column $($Matches[1])"
                    $AppId = $Matches[2]
                    $ColumnNameClean = $Matches[1]
                    if (-not $Apps.ContainsKey($AppId)) {
                        $Apps.Add($AppId, @($ColumnNameClean))
                    }
                    else {
                        $Apps[$AppId] += $ColumnNameClean
                    }
                    
                }
                else {
                    Write-Host "Adding PK column $ColumnName"
                    if (-not $Apps.ContainsKey('')) {
                        $Apps.Add('', @($ColumnName))
                    }
                    else {
                        $Apps[''] += $ColumnName
                    }
                }
            }
            $ColumnsSelect = ''
            foreach ($App in $Apps.Keys) {
                Write-Host "$($App)"
                if ($App -ne '') {

                    $NewViewName = $SQLTableName + '$' + $App
                    Write-Host "Creating View [$NewViewName]" -ForegroundColor Green
                    foreach ($Column in $Apps['']) {
                        $ColumnsSelect += ",[$Column]"
                    }<# #>
                    foreach ($Column in $Apps[$App]) {
                        $ColumnsSelect += ",[$Column`$$App] as [$Column]"
                    }
                    $ColumnsSelect = $ColumnsSelect.Trim(',')
                    $SQLDrop = "if object_id('$NewViewName','v') is not null drop view [$NewViewName]"
                    $SQLCreate = "Create view [$NewViewName] as select $ColumnsSelect from [$TableName]"
                    Write-Host $SQLDrop -ForegroundColor Yellow
                    Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDB -Query $SQLDrop -Encrypt Optional
                    Write-Host $SQLCreate -ForegroundColor Yellow
                    Invoke-Sqlcmd -ServerInstance $SQLServer -Database $SQLDB -Query $SQLCreate -Encrypt Optional
                }
            }
        }
    }
}

RegisterFunction -Function 'CreateViews' -Name 'Create DB Views for pre-BC23 schema'