Powershell 数据集中的sp_msforeachdb

Powershell 数据集中的sp_msforeachdb,powershell,dataset,sp-msforeachdb,Powershell,Dataset,Sp Msforeachdb,有人能告诉我为什么下面的代码只返回数据集中的一行(对于主数据库),而不是服务器上每个数据库的一行 $SQLConn = New-Object System.data.SqlClient.SqlConnection $SQLConn.ConnectionString = "Data Source = $SQLServer; Initial Catalog = master; Integrated Security = True" $S

有人能告诉我为什么下面的代码只返回数据集中的一行(对于主数据库),而不是服务器上每个数据库的一行

 $SQLConn = New-Object System.data.SqlClient.SqlConnection
 $SQLConn.ConnectionString = "Data Source = $SQLServer; Initial Catalog = master;
                             Integrated Security = True"
 $SQLConn.Open()

 $query = "exec sp_msForEachDb 'use [?] SELECT TOP 1 [name] FROM sysusers'"

 $SQLCmd = New-Object System.Data.Sqlclient.SqlCommand($query, $SQLConn);
 $SQLAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
 $SQLAdapter.SelectCommand = $SQLCmd
 $DataSet = New-Object System.Data.Dataset
 $SQLAdapter.Fill($DataSet) | out-null

 ForEach ($row in $DataSet.Tables[0])
 {
    $Name = $row["name"]
    write-host $Name
 }

 $SQLConn.Close()

您的代码使用$dataset.tables的索引位置0显示您的代码。将其更改为
$DataSet.Tables

ForEach ($row in $DataSet.Tables[0])
 {
    $Name = $row["name"]
    write-host $Name
 }
改成

 ForEach ($row in $DataSet.Tables)
     {
        $Name = $row["name"]
        write-host $Name
     }

返回的结果集中有多个数据表,但只显示前一个表[0]。试试这个:

$DataSet.Tables | foreach {$_.name}
下面是一些完整且经过测试的代码,用于组合结果集:

$SQLServer = ".\SQL1"
$query = @"
create table #output
(DB varchar(128),
name varchar(128)

)
exec sp_MSforeachdb  @command1='USE [?];
insert #output SELECT TOP 1 ''?'' AS ''DB'', [name]
FROM sysusers';
select * from #output
"@



$SQLConn = New-Object System.data.SqlClient.SqlConnection
 $SQLConn.ConnectionString = "Data Source = $SQLServer; Initial Catalog = master;
                             Integrated Security = True"
 $SQLConn.Open()


 $SQLCmd = New-Object System.Data.Sqlclient.SqlCommand($query, $SQLConn);
 $SQLAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
 $SQLAdapter.SelectCommand = $SQLCmd
 $DataSet = New-Object System.Data.Dataset
 $SQLAdapter.Fill($DataSet) | out-null

 $DataSet.Tables[0]

 $SQLConn.Close()

我想我需要这样做才能将所有记录都放到一个数据集中:


返回一条错误消息:“无法索引到System.Data.DataTable类型的对象”,该消息不返回任何内容。但这将返回我要查找的整个数据集:$dataset.Tables | foreach{$}。为什么“name”字段会有问题?好吧,也许我不能使用数据集来做这件事?我想我一开始并没有意识到它将来自每个数据库的记录放入不同的数据集表中。所以,当我尝试循环它时,我要么从一个表中获取记录,要么因为它不能循环不同的表对象而出错?也许最好是将所有内容插入SQL Server中的#tmp表中,然后在完成后插入到我的主表中?
 $query = "DECLARE @users TABLE ([name] varchar(100)) INSERT @db_roles 
           exec sp_msForEachDB 'USE [?] SELECT [name] FROM sysusers'
           SELECT [name] FROM @db_roles"