Powershell Invoke-Sqlcmd到DataTable rowcount在其1条记录时不正确

时间:2016-05-04 14:32:51

标签: sql-server powershell

$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"上找到对此的单一引用。我一定做错了什么,但是什么?

2 个答案:

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