【问题标题】:Powershell Invoke-Sqlcmd to DataTable rowcount is incorrect when its 1 recordPowershell Invoke-Sqlcmd to DataTable rowcount 在其 1 条记录时不正确
【发布时间】:2016-10-07 23:48:42
【问题描述】:
$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

让我发疯,是的,我在“内部网络”上找不到一个参考。我一定是做错了什么,但是什么?

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

    当您将查询与 TOP 1 一起使用时,Invoke-SqlCmd 返回一个 DataRow。 当您将查询与 TOP 2 一起使用时,Invoke-SqlCmd 返回一个 DataRows 数组。 Invoke-SqlCmd 不返回 DataTable。您可以更改代码以强制返回一个数组(参见此处:force array),然后检查其上的计数:

    $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
    

    【讨论】:

    • 啊哈。我创建了一个数据表,并认为这足以让它表现得如此。我是新手,所以我需要自己重新审视,但感谢您阐明这个基本概念。
    • 谢谢杜加斯。我的代码更改非常简单,但仍然需要了解我正在定义的数据表以及区别是什么。表是一个可以说的数组。整个invoke-sqlcmd 命令适合成为powershell 中的一种表类型——或者至少这就是dba 可能假设并走错路的方式。我有很多东西要学。
    • @MBuchanan - 您将 Datatable 分配给 $CollectionProfile 变量,但后来您将 Invoke-Sqlcmd 的返回值分配给 $CollectionProfile 变量。由于动态类型,$CollectionProfile 的类型从 DataTable 更改为从 Invoke-Sqlcmd 返回的任何内容。希望对您有所帮助。
    【解决方案2】:

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

    在我的示例中,我用名称代替行,这是我在选择语句“Select top 1 * from Sysdatabases”中的第一个列名。这将为您提供前 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
    

    【讨论】:

    • 我喜欢这个解决方案。非常简单,效果很好。
    • 不适用于 TOP 1
    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 2018-11-23
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多