sp_msforeachdb в наборе данных
Может кто-нибудь сказать мне, почему следующий код возвращает только одну строку из DataSet (для главной базы данных) вместо одной для каждой базы данных на сервере?
$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()
3 ответа
Я думаю, что мне нужно было сделать что-то вроде этого, чтобы собрать все записи в один набор данных:
$query = "DECLARE @users TABLE ([name] varchar(100)) INSERT @db_roles
exec sp_msForEachDB 'USE [?] SELECT [name] FROM sysusers'
SELECT [name] FROM @db_roles"
Вы возвращаете несколько наборов данных в наборе результатов, но видите только первые таблицы [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. Измените это на $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
}