A common question that I've seen online is how do I return multiple sql datasets from a single query using INVOKE-SQLCMD. Most of the answers out there say it is not possible, but it is in fact possible by using the OutputAs dataset parameter. This parameter outputs a dataset that has all of the information needed. The code below will setup our script and save the return data into a Powershell variable called $ds that we can use later.
$ServerInstance = sname
$sql = "SELECT
SERVERPROPERTY('MachineName') MachineName
, SERVERPROPERTY('ProductVersion') ProductVersion
, SERVERPROPERTY( 'InstanceName') InstanceName
, SERVERPROPERTY('InstanceDefaultDataPath') InstanceDefaultDataPath
, SERVERPROPERTY( 'InstanceDefaultLogPath') InstanceDefaultLogPath
, DB_NAME() DatabaseName
;
SELECT name FROM msdb.sys.databases;"
$ds = invoke-sqlcmd -ServerInstance $ServerInstance -Query $sql -OutputAs dataset
$ds
As you can see there is a lot of information in the object that gets returned and saved in the $ds variable. However, that still is not the data we are looking for. You may have noticed the top line RemotingFormat: XML. This means I can parse through it quite easily by using the command below which confirms that there is infact 2 tables saved in the object.
$ds.tables.count 2
Now you can see there are 2 tables in this XML and the next command will return the first query. Notice the [0] is the zero based notation for an array so 0 is the first dataset, 1 is the second and so on.
$ds.tables.table[0]
Second query result set
$ds.tables.table[1]
I hope this helps dispel the myth that INVOKE-SQLCMD can't return multiple datasets.
