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

时间:2015-06-22 13:49:01

标签: sql-server sql-server-2008 powershell

后台:我有一个目录,其中包含许多导入SQL Server的文件。

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

最终目标:要显示除文件名之外的SQL结果,但显示的结果集还应显示SQL Server中没有条目的文件。类似于SQL服务器查询中的RIGHT 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 Server表中没有相应条目的文件

当前结果

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 个答案:

答案 0 :(得分:0)

$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小提琴编辑答案: http://sqlfiddle.com/#!3/12b43/9

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

答案 1 :(得分:0)

好的,如果SQL查询没有结果,则返回NULL,实质上,没有任何内容添加到$dbResults数组中。而是将结果附加到自定义对象。我不知道你有什么PowerShell版本所以我需要做一些我知道应该工作的东西。我也没有使用SQL cmdlet,所以我不得不猜测一些。

$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变量的方式,并在那里移动了长度条件。

应该现在拥有所有预期的结果。我说应该因为我假设返回对象看起来像什么。