0

次のコードが、サーバー上のデータベースごとに 1 行ではなく、DataSet (マスター データベース用) から 1 行しか返さない理由を教えてください。

 $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()
4

3 に答える 3

0

結果セットに複数のデータテーブルを取得して返されますが、最初の1つのTables[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()
于 2013-03-20T13:06:24.203 に答える
0

あなたのコードは、$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
     }
于 2013-03-19T18:42:29.037 に答える
0

すべてのレコードを1 つのデータセットにまとめるには、次のようなことが必要だったと思います。

 $query = "DECLARE @users TABLE ([name] varchar(100)) INSERT @db_roles 
           exec sp_msForEachDB 'USE [?] SELECT [name] FROM sysusers'
           SELECT [name] FROM @db_roles"
于 2013-03-20T17:24:30.213 に答える