当前位置: 首页 > 知识库问答 >
问题:

加入SQL查询结果和Get-ChildItem结果

濮阳和泰
2023-03-14

背景:我有一个目录,其中包含许多导入SQL服务器的文件。

任务:创建PowerShell脚本,该脚本将拾取此目录中的文件,并使用SQL查询中的文件名。

最终目标:除了显示文件名之外,显示SQL结果,但显示的结果集也应该显示服务器中没有条目SQL文件。类似于SQL服务器查询中的右JOIN

Powershell代码

$files = Get-ChildItem -Recurse -Force $filePath -ErrorAction SilentlyContinue | Where-Object { ($_.PSIsContainer -eq $false) } | Select-Object Name
$Server = "Loadv1"
$DB = "LoadDB"
$dbResults = @()

ForEach ($file in $files)
{
    $fileName = $file.name
    write-host $fileName

    if($fileName.Length -gt 1)
    {
        $Query = "
            SELECT FileName,CurrentStatus 
            FROM LogStatus
            WHERE FileName LIKE '$fileName%'
        "
#       Write-host $Query
    }

    $dbResults += Invoke-Sqlcmd -ServerInstance $Server -Database $DB -Query $Query
}
$dispResults = $dbResults,$file
$dispResults | Format-Table -autosize

到目前为止完成的工作:我已经能够使用Get-ChildItem获取文件名并循环它们以获取查询结果。但是,我当前获得的结果不显示服务器表中没有相应条目SQL文件

当前结果

OperationalLanding20150622061502.dat
OperationalLandingAudit20150622061502.dat
OperativeThird_Party_System20150616090701.dat


FileName                                       CurrentStatus
OperationalLandingAudit20150622061502.dat      SSIS Package Complete
OperativeThird_Party_System20150616090701.dat  SSIS Package Complete

预期结果

OperationalLanding20150622061502.dat
OperationalLandingAudit20150622061502.dat
OperativeThird_Party_System20150616090701.dat


FileName                                       CurrentStatus
OperationalLanding20150622061502.dat           NULL
OperationalLandingAudit20150622061502.dat      SSIS Package Complete
OperativeThird_Party_System20150616090701.dat  SSIS Package Complete

希望我能解释我的上述要求。

共有2个答案

林星华
2023-03-14
$Query = "
            SELECT isNull(A.FileName, b.FileName) FileName,ISNULL(A.CurrentStatus,B.CurrentStatus) CurrentStatus 
        FROM LogStatus A
        Right JOIN (SELECT '$filename' FileName,NULL CurrentStatus) B 
        ON a.Filename like '$filename%'

        "

这应该会为您填充文件名。由于它在powershell中,因此原型制作有点困难,但我可能会想出一个sql小提琴来证明这一点。

编辑

答案已编辑,使用sql FIDLE:http://sqlfiddle.com/#!12月3日B43/9

显然,由于您处于游标中,我们一次只能证明一个查询。

梁华清
2023-03-14

好的,如果SQL查询没有结果,则返回NULL,本质上,没有任何内容添加到$db结果数组。相反,让我们将结果附加到自定义对象。我不知道你有什么PowerShell版本,所以我需要做一些我知道应该有效的事情。我也不太使用SQLcmdlet,所以我不得不猜测其中的一些。

$files = Get-ChildItem -Recurse -Force $filePath -ErrorAction SilentlyContinue | 
    Where-Object {$_.PSIsContainer -eq $false -and $_.Length -gt 1} | 
    Select-Object -ExpandProperty Name
$Server = "Loadv1"
$DB = "LoadDB"

$files | ForEach-Object{
    write-host $_

    $Query = "
        SELECT FileName,CurrentStatus 
        FROM LogStatus
        WHERE FileName LIKE '$_%'
    "
    $Results = Invoke-Sqlcmd -ServerInstance $Server -Database $DB -Query $Query

    $props = @{Name = $_}

    If($Results){
        $props.CurrentStatus = $Results.CurrentStatus
    } Else {
        $props.CurrentStatus = "Null"
    }

    New-Object -TypeName PSCustomObject -Property $props

} | Format-Table -autosize

这样做是创建一个包含sql查询结果的自定义对象(出于上述原因我没有更改)。如果没有返回结果,我们使用字符串“null”作为填充。

我清理了如何生成$files变量,方法是使用-Expand创建一个简单的字符串数组,并将长度条件移动到那里。

您现在应该已经获得了所有预期的结果。我说应该,因为我假设返回对象是什么样子。

 类似资料:
  • 问题内容: 我非常确定我们不能将LIMIT子句用于我想做的事情-因此想确定是否还有其他方法可以实现此目的。 我有一个表,其中捕获了哪个用户访问了哪个商店。每次用户访问商店时,都会在此表中插入一行。 一些领域是 shopping_id(primary key) store_id user_id 现在,我想要的是-对于给定的一组商店,找到访问该商店的最大次数的前5位用户。 我可以一次在1个商店中进行以

  • 问题内容: 我正在用SSRS编写一份报告。该数据集填充有MS SQL Server的SQL查询。它使用Union All查询几个相似的表。问题是有一些信息丢失。不同的表适用于不同的工作站点,但是这些表中的任何列都没有站点名称。标识站点的唯一方法是通过表名。在“全部合并”的结果的合并列中,无法分辨出哪些行来自哪个站点。 有没有一种方法可以更改我的查询以在结果中添加一列,该列将具有与每一行相关联的工作

  • 要运行查询,在工具栏中点击 运行 。如果查询语句是正确的,该查询将被运行,如果该查询应该返回数据,结果 选项卡会打开查询返回的数据。如果运行查询时发生错误,运行停止,显示相应的错误信息。 结果 选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格查看 和 表单查看。详细信息请看表查看 器。 提示:Navicat 支持返回 10 个结果集。 注意:你可以通过选择 查看 -> 显示结果 -

  • 你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navi

  • 你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器、数据库和/或模式。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格视图和表单视图。详细信息请参阅数据查看器。 【注意】Navicat

  • 你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navicat