【问题标题】:PowerShell - storing multiple query results in a single variablePowerShell - 将多个查询结果存储在一个变量中
【发布时间】: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 "&lt;sql SELECT statement&gt;" }也会失败吗?
  • @Theo,我认为已经完成了!几天到一周后我才能“真正地”尝试它,但我相信这是解决方法。将标记为答案,如果有任何问题,我会在这里跟进。谢谢!
  • 我还没有发布答案,因为我相信您还需要将$item 发送到包装脚本,以便它知道要查询的主机,我会等你测试出来。想知道这是否有帮助。 ;)

标签: sql-server powershell


【解决方案1】:

这是我的评论作为答案。

通过使用+= 串联将内容添加到要成为数组的循环中,每次都需要重新创建整个数组,这会大大降低内存消耗和处理速度。

使用这种语法让 Powerhell 收集要存储的对象要高效得多:

$results = foreach ($item in $serverList) { .\wrapper-script "<sql SELECT statement>" }

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2014-03-20
    • 1970-01-01
    • 2013-04-12
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多