Search code examples
ssasssas-tabular

How can I get the Last Processed timestamp for an SSAS tabular cube?


In SSMS I have connected to a SSAS tabular cube. When I view the properties screen I see the Last Processed timestamp of 11/24/2015 2:59:20 PM.

If I use SELECT LAST_DATA_UPDATE FROM $system.MDSchema_Cubes I see a timestamp of 11/25/2015 12:13:28 PM (if I adjust for the timezone).

If I open up the partitions screen for one of the tables in my cube I see that the most Last Processed timestamp is 11/25/2015 12:13:28 PM which matches the value from the DMV.

I want the Last Processed timestamp for my BISM, the one from the Database Properties screen, not the one from a partition that happened to be processed later.

Is there a way to get this programmatically?


Solution

  • After looking at the code in the Analysis Services Stored Procedure assembly I was able to put together a powershell script that got the date I was looking for. Here is the code:

    #we want to always stop the script if any error occurs
    $ErrorActionPreference = "Stop"
    $error.Clear()
    
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices") | Out-Null
    
    $databases = @('BISM1', 'BISM2')
    $servers = @('Server1\BISM', 'Server2\BISM')
    
    function Get-BISMLastProcessed
    {
      param(
        [string] $connStr
      )
      Begin {
        $server = New-Object Microsoft.AnalysisServices.Server
        $server.Connect($connStr)
      }
      Process {
        Try {
        $database = $server.Databases.GetByName($_)
        Write-Host "  Database [$($database.Name)] was last processed $($database.LastProcessed)"
        }
        Catch [System.Exception] {
          Write-Host $Error[0].Exception
        }
        Finally {
          if ($database -ne $null) {
              $database.Dispose()
          }    
        }
      }
      End {
        $server.Dispose()
      }
    }
    
    
    foreach ($server in $servers) {
      $connectStr = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BISM1;Data Source=$server"
      Write-Host "Server [$server]"
      $databases | Get-BISMLastProcessed $connectStr
      Write-Host "----------------"
    }
    

    The results are:

    Server [Server1\BISM]
      Database [BISM1] was last processed 11/30/2015 12:25:48
      Database [BISM2] was last processed 12/01/2015 15:53:56
    ----------------
    Server [Server2\BISM]
      Database [BISM1] was last processed 11/30/2015 12:19:32
      Database [BISM2] was last processed 11/02/2015 23:46:34
    ----------------