后台:我有一个目录,其中包含许多导入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
希望我能够解释上面的要求。
答案 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
变量的方式,并在那里移动了长度条件。
你应该现在拥有所有预期的结果。我说应该因为我假设返回对象看起来像什么。