2013-03-19 3 views
0

Может кто-нибудь сказать мне, почему следующий код возвращает только одну строку из DataSet (для master db) вместо одной для каждой базы данных на сервере?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

Ваш код показывает ваше использование позиции индекса 0 из $ dataset.tables. Измените его на $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

Вы получаете возвращение нескольких DataTables в результирующий набор, но показывает только первые один 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() 
+0

, который ничего не возвращает. но это возвращает весь набор данных, который я ищу: $ DataSet.Tables | foreach {$ _}. Почему у него есть проблема с полем «имя»? – user2089287

+0

ОК, может быть, я не могу использовать набор данных для этого? Я предполагаю, что сначала не понял, что он помещает записи из каждой базы данных в таблицу * разных * наборов данных. Итак, когда я пытаюсь его пропустить, я либо получаю записи из одной таблицы, либо ошибку, потому что он не может перебирать разные объекты таблицы? Может быть, лучше просто вставить все в таблицу #tmp в SQL Server, а затем вставить в мою основную таблицу, когда это будет сделано. ? – 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" 
Смежные вопросы