2013-03-19 2 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을 사용하고 있습니다. 당신은 당신의 결과 집합에서 여러 datatables를 받고 반환하지만 첫 번째 테이블을 보여주는 것 ...에 $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

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

+0

좋아요, 아마도 데이터 집합을 사용하여이 작업을 수행 할 수 없습니까? 처음에는 각 데이터베이스의 레코드를 다른 * 데이터 세트 테이블에 저장한다는 사실을 깨닫지 못했습니다. 그래서, 그것을 통해 루프를 시도 할 때 하나의 테이블에서 레코드를 가져 오거나 다른 테이블 개체를 통해 루프 수 없기 때문에 오류가? 어쩌면 모든 것을 SQL Server의 #tmp 테이블에 삽입 한 다음 완료되면 내 주 테이블에 삽입하는 것이 더 나을 것입니다. ? – user2089287

0

은 내가 하나 데이터 세트에 기록 모든를 얻을 수 같은 것을 할 필요가 생각을 :

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