2017-06-21 29 views
0

我有一个SQL查询其拉设备名称,小学,中学和高等教育返回从表:如何筛选空白条目从数据库查询

$SQLQuery= (Invoke-Sqlcmd -Serverinstance $ServerInstance -Database $Database -Query "select DeviceName, Primary, Secondary, Tertiary from dbo.Table") 

我再扔这些项目分成哈希表与主/第二/第三作为值的数组:

$DeviceList = @{} 
foreach ($item in $SQLQuery) 
{ 
if($item.Primary -and $item.Secondary -and $item.Tertiary) 
{ 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)", "$($item.Secondary)", "$($item.Tertiary)"} 
} 
elseif ($item.Primary -and $item.Secondary -and !$item.Tertiary) 
{ 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)", "$($item.Secondary)"} 
} 
elseif ($item.Primary -and !$item.Secondary -and !$item.Tertiary) 
{ 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)"} 
} 

我遇到的问题是,SQL查询可以返回未NULL空白的结果。这使得$DeviceList这个样子的:

elseif ($item.Primary -and !$item.Secondary -and !$item.Tertiary) 
{ 
    if($item.Primary -ne '') 
    { 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)"} 
    } 
} 

但是,这是令人难以置信的重复,且耗时:

$devicelist = @{ 
    "Device1" = "[email protected]"; 
    "Device7" = "[email protected]"; 
    "Device8" = "[email protected]"; 
    "Device2" = "[email protected]", "[email protected]"; 
    "Device3" = "[email protected]", ""; 
    "Device4" = "[email protected]", "", "[email protected]"; 
    "Device5" = "[email protected]", "[email protected]", "[email protected]"; 
    "Device6" = "[email protected]", "[email protected]", "" 
} 

我可以在重复抛出的if语句,如过滤这些。我也可以修改SQL查询以忽略这些,但我更愿意保持SQL查询简单并在PowerShell中进行过滤。必须有一个更简单的方法来做到这一点。

,我寻找的最终结果是,如果该条目是空白的,它只是被跳过,所以$DeviceList应该是这样的:

$devicelist = @{ 
    "Device1" = "[email protected]"; 
    "Device7" = "[email protected]"; 
    "Device8" = "[email protected]"; 
    "Device2" = "[email protected]", "[email protected]"; 
    "Device3" = "[email protected]"; 
    "Device4" = "[email protected]", "[email protected]"; 
    "Device5" = "[email protected]", "[email protected]", "[email protected]"; 
    "Device6" = "[email protected]", "[email protected]" 
} 

如果我的问题没有意义,请让我知道,我会尽力澄清。一如既往,谢谢!

回答

2

内建了每台设备逐步名单:

$DeviceList = @{}; 
foreach ($item in $SQLQuery) 
{ 
    $arr = @(); 
    if($item.Primary -ne $null -and $item.Primary -ne [System.DBNull]::Value -and $item.Primary -ne '') 
    { 
     $arr += "$($item.Primary)"; 
    } 
    if($item.Secondary -ne $null -and $item.Secondary -ne [System.DBNull]::Value -and $item.Secondary -ne '') 
    { 
     $arr += "$($item.Secondary)"; 
    } 
    if($item.Tertiary -ne $null -and $item.Tertiary -ne [System.DBNull]::Value -and $item.Tertiary -ne '') 
    { 
     $arr += "$($item.Tertiary)"; 
    } 
    if ($arr.count -gt 0) 
    { 
     $DeviceList += @{$item.DeviceName = $arr}; 
    } 
} 

我不知道如果Invoke-Sqlcmd将返回NULLDBNull,所以我已经包括两个检查。

+0

Andy,在我将'$ arr = @ {}'更改为'$ arr = @()'后,实际上您的第一个答案完美奏效。你让我的生活变得如此简单,非常感谢你! – Nick

0

与WMI的一个例子,因为我没有安装SQL的更多信息:

(Get-WMIObject -Class Win32_Bios).PSObject.Properties|? Value -ne $NULL|ft Name, Value 

这将只返回非空的属性,但会失去所有Win32_BIOS类可以功能。我认为这应该是罚款给你的代码的上下文。