2013-03-19 52 views
0

有人能告訴我爲什麼以下代碼只從DataSet(對於主數據庫)返回一行,而不是爲服務器上的每個數據庫返回一行?數據集中的sp_msforeachdb

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

回答

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 
    } 
+0

返回錯誤消息:「無法索引到System.Data.DataTable類型的對象」 – user2089287 2013-03-19 21:14:12

0

你在返回結果集獲得多個數據表,但只顯示第一個表[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() 
+0

不返回任何內容。但是這會返回我正在查找的整個數據集:$ DataSet.Tables | foreach {$ _}。爲什麼它在「名稱」字段中存在問題? – user2089287 2013-03-20 13:45:00

+0

好吧,也許我不能使用數據集來做到這一點?我想我一開始並沒有意識到它將每個數據庫的記錄放入一個*不同的數據集表中。因此,當我試圖循環訪問它時,我是從一個表中獲取記錄,還是因爲無法循環訪問不同的表對象而出現錯誤?也許最好是將所有內容插入到SQL Server的#tmp表中,然後在完成後插入到主表中。 ? – user2089287 2013-03-20 16:39:07

0

我想我需要做這樣的事情來獲得的記錄所有一個數據集:

$query = "DECLARE @users TABLE ([name] varchar(100)) INSERT @db_roles 
      exec sp_msForEachDB 'USE [?] SELECT [name] FROM sysusers' 
      SELECT [name] FROM @db_roles"