public/Invoke-ASQuery.ps1

Function Invoke-ASQuery {

<#
    .SYNOPSIS
    Executes a MDX/DMX/DAX query.
     
    .DESCRIPTION
    Executes a MDX/DMX/DAX query and returns the result in a DataSet
 
    .EXAMPLE
    Invoke-ASQuery -Query 'EVALUATE Date' -ASServerInstance '.' -ASDatabase 'MyCube'
 
    .PARAMETER Query
    The MDX/DMX/DAX query to execute.
 
    .PARAMETER ASServerInstance
    The Analysis Services server instance to execute the query against.
 
    .PARAMETER ASDatabase
    The Analysis Services database to execute the query in.
 
    .PARAMETER QueryTimeout
    A timeout for the query.
 
    .INPUTS
    TO DO
     
    .OUTPUTS
    A PSObject for each record in the query output. The object has a structure similar to the records in the output.
     
    .LINK
    https://github.com/DennisWagner/SQLServerDevOpsTools
     
    .NOTES
    Written by (c) Dennis Wagner Kristensen, 2022 https://github.com/DennisWagner/SQLServerDevOpsTools
    This PowerShell script is released under the MIT license http://www.opensource.org/licenses/MIT
#>

    [CmdletBinding()]
    Param (
                [Parameter(Mandatory=$true)]$Query,
                [Parameter(Mandatory=$true)]$ASServerInstance,
                [Parameter(Mandatory=$true)]$ASDatabase,
                [Parameter(Mandatory=$false)]$QueryTimeout
    )
    BEGIN {
        [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.AdomdClient") | Out-Null;
    }

    PROCESS {       
        
        $Connection = New-Object Microsoft.AnalysisServices.AdomdClient.AdomdConnection
        $Connection.ConnectionString = "Data Source=$ASServerInstance;Catalog=$ASDatabase"
        $Connection.Open()
        $Command = New-Object Microsoft.AnalysisServices.AdomdClient.AdomdCommand
        $Command.Connection = $Connection
        $Command.CommandText = $Query
        If ($QueryTimeout) {
            $Command.CommandTimeout = $QueryTimeout
        }

        $DataAdapter = New-Object Microsoft.AnalysisServices.AdomdClient.AdomdDataAdapter($Command)
        $DataSet = New-Object System.Data.DataSet
        $DataAdapter.Fill($DataSet) | Out-Null

        $DataTable = New-Object Data.DataTable
        $DataTable = $DataSet.Tables[0]

        ForEach ($Row in $DataTable)
        {
            $Properties = @{}
            For($i = 0;$i -le $Row.ItemArray.Count - 1;$i++)
            {
                $Properties.Add($DataTable.Columns[$i], $Row.ItemArray[$i])
            }

            Write-Output $(New-Object -TypeName PSObject -Property $Properties ) 
        }
    }
    END {
        $Connection.Close() 
    }
}