如何将SQL Server查询结果存储到Powershell数组?

jgwigjjp  于 2022-12-17  发布在  SQL Server
关注(0)|答案(1)|浏览(137)

我是PowerShell脚本的新手,目前正在编写一个脚本来加载SQL Server查询的结果,以存储为PowerShell数组。以下是我的代码供参考:

$SQLServer = 'MyServer';
 $Database = 'Test';
    
 ## - Connect to SQL Server using non-SMO class 'System.Data':
 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
 $SqlConnection.ConnectionString = `
 "Server = $SQLServer; Database = $Database; Integrated Security = True";
    
 $SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
 $SqlCmd.CommandText = $("select distinct Servername from dbo.tableA
where Servername like '%hw%'");
 $SqlCmd.Connection = $SqlConnection;
 $SqlCmd.CommandTimeout = 0;
    
 ## - Extract and build the SQL data object '$DataSetTable':
 $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
 $SqlAdapter.SelectCommand = $SqlCmd;
 $DataSet = New-Object System.Data.DataSet;
 $SqlAdapter.Fill($DataSet);
    
 $SqlConnection.Close()
 $Servername = @[SqlAdapter]

我希望$Servername是一个数组,根据sqlquery结果将数据元素存储为“Server 1”、“Server 2”、“Server 3”等。我计划将来使用$Servername数组遍历每个服务器。目前,我能够成功连接到数据库,但是我仍然无法将查询结果存储在PowerShell数组中。有人能告诉我哪里出错了吗?

dfddblmv

dfddblmv1#

$SqlAdapter.Fill($DataSet)
这将用查询结果填充存储在$DataSet中的[System.Data.DataSet]示例,这就是为什么必须使用$DataSet来获取所需数据(未测试)的原因:

$serverNames = $DataSet.Tables[0].Server
  • .Tables[0]访问包含查询结果的数据集中的第一个也是唯一的[System.Data.DataTable]示例。
  • .Server检索查询结果的Server列的值,由PowerShell的member-access enumeration提供。
  • 注意,这意味着如果只有 * 一个 * 结果行,$serverNames将包含一个 * 单个字符串 *,而不是包含该字符串的单个元素 * 数组 *。
  • 若要确保“始终”返回数组,请使用

$serverNames = @($DataSet.Tables[0].Server),或者,在(强)类型约束下,
x1米10英寸1x
至于你所尝试的

  • PowerShell语句只有在 * 放在同一行 * 时才需要用;分隔,这意味着代码中的所有;示例都是不必要的。
  • 虽然$("select distinct Servername from dbo.tableA where Servername like '%hw%'")在技术上可以工作,但是没有理由在子表达式运算符中包含双引号字符串文字("...")--只需省略$(...)的 shell 即可。
  • 对于$Servername = @[SqlAdapter]:也许那只是伪代码,但是,要明确的是:@[...]不是PowerShell中的有效语法构造(至少在PowerShell 7.3[1]中)。

[1]巧合的是,@[...]只是作为潜在的 * 未来 * 语法出现,用于简化PowerShell的[pscustomobject]对象文本语法-请参见GitHub问题#18747。

相关问题