$sql=("select top 1 * FROM CollectionProfile")
$CollectionProfile = New-Object System.Data.DataTable
$CollectionProfile = Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop
$CollectionProfile.Rows.Count
退货:0
但如果我将TOP计数更改为2 -
$sql=("select top 2 * FROM CollectionProfile")
退货:2
让我发疯,是的,我无法在" innernets"上找到对此的单一引用。我一定做错了什么,但是什么?
答案 0 :(得分:2)
当您使用TOP 1的查询时,Invoke-SqlCmd返回DataRow。 当您使用TOP 2的查询时,Invoke-SqlCmd返回一个DataRows数组。 Invoke-SqlCmd不返回DataTable。您可以更改代码以强制返回数组(请参阅此处:force array),然后检查其上的Count:
$sql = ("select top 1 * FROM CollectionProfile")
$CollectionProfile = @(Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop)
$CollectionProfile.Count #Returns 0 with Null, 1 with TOP 1, and 2 with TOP 2
答案 1 :(得分:0)
使用select语句中的一个列名代替Rows,这将给出正确的结果计数。
在我的示例中,我使用name来代替行,这是我在select语句“从Sysdatabases中选择顶部1 *”中的第一个列名。这将为前1或前2提供正确的结果..
$sql=("select top 1 * FROM sysdatabases")
$sysdatabases = New-Object System.Data.DataTable
$sysdatabases = Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop
$sysdatabases.name.Count