如何对 SQLServer 数据库执行 SELECT 查询并使用 PowerShell 迭代结果

How do I execute a SELECT query against a SQLServer database and iterate results using PowerShell

假设我有一个包含 3 列的 table - "Column1"、"Column2" 和 "Column3" - 所有 3 列的数据类型都是 varchar(100)。

如何使用 PowerShell 连接到 SQL 服务器并使用 SqlDataReader 和 ForEach 运算符查看 "Column2" 的内容?

以下是我的大致做法:

$SqlServer = 'sql.example.com';
$SqlDatabase = 'MyDB';

$SqlConnectionString = 'Data Source={0};Initial Catalog={1};Integrated Security=SSPI' -f $SqlServer, $SqlDatabase;
$SqlQuery = "SELECT Name FROM dbo.Person ORDER BY Name;";

$SqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $SqlConnectionString;
$SqlCommand = $SqlConnection.CreateCommand();
$SqlCommand.CommandText = $SqlQuery;

$SqlConnection.Open();
$SqlDataReader = $SqlCommand.ExecuteReader();

#Fetch data and write out to files
while ($SqlDataReader.Read()) {
    Write-Output $SqlDataReader['Name'];
}
$SqlConnection.Close();
$SqlConnection.Dispose();

如果我没记错的话,我基本上重构了the MSDN example的代码。

对于那些想知道我为什么使用 SqlDataReader 的人:我的大部分脚本都使用 SqlDataAdapter,但是这个脚本从数据库中检索了大约 8,000 个 PDF,所以我对调用 SqlDataAdapter.Fill() 并不感兴趣。作为在 table 上持有比 SqlDataAdapter.Fill() 长得多的共享锁的交换,SqlDataReader.Read() 通过一次获取一条记录将内存使用率降低到客户端可管理的水平。