gpt4 book ai didi

sql - 在PowerShell中处理System.DBNull

转载 作者:行者123 更新时间:2023-12-04 02:37:51 29 4
gpt4 key购买 nike

编辑:从PowerShell 7 Preview 2开始,由于Joel Sallow通过pull request 9794-not [System.DBNull]::Value的计算结果为$true
花更多时间在PowerShell中提取SQL数据。在比较过程中,遇到[System.DBNull]::Value问题以及PowerShell的行为方式。
这是我看到的行为的一个示例,以及解决方法

#DBNull values don't evaluate like Null...
if([System.DBNull]::Value){"I would not expect this to display"}
# The text displays.
if([string][System.DBNull]::Value){"This won't display, but is not intuitive"}
# The text does not display.

#DBNull does not let you use certain comparison operators
10 -gt [System.DBNull]::Value
# Could not compare "10" to "". Error: "Cannot convert value "" to type "System.Int32". Error: "Object cannot be cast from DBNull to other types.""

[System.DBNull]::Value -gt 10
# Cannot compare "" because it is not IComparable.

#No real workaround. Must use test for null workaround in conjunction to avoid comparison altogether:
[string][System.DBNull]::Value -and [System.DBNull]::Value -gt 10

#Example scenario with a function that uses Invoke-Sqlcmd2 to pull data
Get-XXXXServer | Where-Object{$_.VCNumCPUs -gt 8}
#Error for every line where VCNumCPU has DBNull value

#workaround
Get-XXXXServer | Where-Object{[string]$_.VCNumCPUs -and $_.VCNumCPUs -gt 8}
我是否遗漏了任何东西,或者没有“简单”的解决方法来让缺乏经验的人按预期使用PowerShell比较?
我提交了 a suggestion on Connect,并拥有一个临时的 workaround from Dave Wyatt,它将数据行转换为psobjects,而dbnulls转换为null,但这是 adds a bit of overhead。鉴于PowerShell的现有“松散”行为,似乎应该在幕后进行处理?
有什么提示,还是我现在已经用尽了所有选择?

最佳答案

我认为您在这里采用了错误的方法。与documented一样,DBNull类表示不存在的值,因此像-gt-lt这样的比较没有任何意义。不存在的值既不大于也不小于任何给定值。但是, Value 字段具有Equals()方法,该方法可让您检查值是否为DBNull:

PS C:> ([DBNull]::Value).Equals(23)
False
PS C:> ([DBNull]::Value).Equals([DBNull]::Value)
True

关于sql - 在PowerShell中处理System.DBNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285149/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com