Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Powershell Invoke Sqlcmd to DataTable rowcount在其记录为1时不正确_Sql Server_Powershell - Fatal编程技术网

Sql server Powershell Invoke Sqlcmd to DataTable rowcount在其记录为1时不正确

Sql server Powershell Invoke Sqlcmd to DataTable rowcount在其记录为1时不正确,sql-server,powershell,Sql Server,Powershell,返回:0 但是如果我把最高计数改为2- $sql=("select top 1 * FROM CollectionProfile") $CollectionProfile = New-Object System.Data.DataTable $CollectionProfile = Invoke-Sqlcmd -ServerInstance $Instance -Database $db -Query $sql -ErrorAction Stop $CollectionProfile.

返回:0

但是如果我把最高计数改为2-

$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
收益:2


真让我抓狂,是的,我在“内部网络”上找不到这方面的任何参考。我一定是做错了什么事,但是什么呢?

当您对TOP 1使用查询时,Invoke SqlCmd返回一个数据行。 将查询与TOP 2一起使用时,Invoke SqlCmd将返回一个DataRows数组。调用SqlCmd不会返回数据表。您可以更改代码以强制返回数组(请参见此处:),然后检查其计数:

$sql=("select top 2 * FROM CollectionProfile")

使用select语句中的一个列名代替行,这将给出正确的结果计数

在我的示例中,我在select语句“select top 1*from Sysdatabases”中给出了行的名称,这是我的第一个列名。这将为您提供前1名或前2名的正确结果

$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

啊哈。我创建了一个datatable,并认为这足以让它表现出这样的行为。我是一个新手,所以我需要重新审视自己,但感谢你澄清了这个基本想法。谢谢杜加斯。对我来说,非常简单的代码更改,但仍然需要了解我所定义的数据表以及它们之间的区别。可以说,表是一个数组。整个invoke-sqlcmd命令使自己成为powershell中的一种表类型——或者至少dba可能会这样认为并走上错误的道路。我有很多东西要学。@MBuchanan-您为$CollectionProfile变量分配了一个Datatable,但后来将Invoke Sqlcmd的返回值分配给了$CollectionProfile变量。由于动态类型,$CollectionProfile的类型从DataTable更改为Invoke Sqlcmd返回的任何类型。希望有帮助。我喜欢这个解决方案。非常简单,效果非常好。
 $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