我是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数组中。有人能告诉我哪里出错了吗?
1条答案
按热度按时间dfddblmv1#
$SqlAdapter.Fill($DataSet)
这将用查询结果填充存储在
$DataSet
中的[System.Data.DataSet]
示例,这就是为什么必须使用$DataSet
来获取所需数据(未测试)的原因:.Tables[0]
访问包含查询结果的数据集中的第一个也是唯一的[System.Data.DataTable]
示例。.Server
检索查询结果的Server
列的值,由PowerShell的member-access enumeration提供。$serverNames
将包含一个 * 单个字符串 *,而不是包含该字符串的单个元素 * 数组 *。$serverNames = @($DataSet.Tables[0].Server)
,或者,在(强)类型约束下,x1米10英寸1x
至于你所尝试的:
;
分隔,这意味着代码中的所有;
示例都是不必要的。$("select distinct Servername from dbo.tableA where Servername like '%hw%'")
在技术上可以工作,但是没有理由在子表达式运算符中包含双引号字符串文字("..."
)--只需省略$(...)
的 shell 即可。$Servername = @[SqlAdapter]
:也许那只是伪代码,但是,要明确的是:@[...]
不是PowerShell中的有效语法构造(至少在PowerShell 7.3[1]中)。[1]巧合的是,
@[...]
只是作为潜在的 * 未来 * 语法出现,用于简化PowerShell的[pscustomobject]
对象文本语法-请参见GitHub问题#18747。