【发布时间】:2020-05-28 13:08:07
【问题描述】:
TL;DR:我正在寻找一种将 SQL 查询结果附加到 PowerShell DataRow 变量以继续存储来自多个查询的结果的方法。
我是 PowerShell 的新手,我在工作中“继承”了一个脚本,它运行内部(公司开发的)PowerShell 包装脚本作为查询 MS SQL 数据库的前端。基本上脚本是这样做的:
$results = .\wrapper-script ""
$results.GetType() 告诉我它是 System.Data.DataRow 类型的对象。
$result 的内容在下游处理,一切正常。
但是,SQL SELECT 语句参数越来越长(它从资产数据库中查询特定服务器的属性),因为我需要提取数据的主机列表越来越长。所以我试图修改脚本,以便我可以用要查询的主机填充一个文本文件,使用 Get-Content 读取它,然后使用“foreach”循环遍历该主机列表并运行单个 SQL每个主机查询,睡一会儿(不要敲击数据库),然后继续将每个结果集附加到 $results 变量。我尝试了以下方法:
$serverList = Get-Content -Path /path/to/file
foreach ($item in $serverList) {
$curObj = .\wrapper-script "<sql SELECT statement>"
$results += $curObj
}
但是脚本在这里爆炸了,我还不确定原因,但我猜 += 不是对这种对象类型的有效操作,希望有其他方法可以做到这一点。
我需要保持对象类型完好无损,因为这只是一个更大脚本的一部分,而且以我目前的 PoSh 技能水平,我需要在这些范围内操作,并且不能咬得太多。
所以最终,我正在寻找一种方法来继续将 SQL 查询结果附加到现有的 DataRow 变量中。这可能吗?
谢谢!
【问题讨论】:
-
这感觉像是一个 XY 问题。如果您正在运行多个 SQL 文件,那么它们可以轻松地提供具有不同定义的结果集;并且您不能将具有不同定义的结果集组合在一起。
-
如果我没听错的话,结果集的结构(字段/列)将始终相同;唯一会改变的是价值观。
-
试试
$results = foreach ($item in $serverList) { .\wrapper-script "<sql SELECT statement>" }也会失败吗? -
@Theo,我认为已经完成了!几天到一周后我才能“真正地”尝试它,但我相信这是解决方法。将标记为答案,如果有任何问题,我会在这里跟进。谢谢!
-
我还没有发布答案,因为我相信您还需要将
$item发送到包装脚本,以便它知道要查询的主机,我会等你测试出来。想知道这是否有帮助。 ;)
标签: sql-server powershell