如何从 PowerShell 循环 SQL 运行 的结果(system.Data.DataSet 对象)

How to loop over the result (system.Data.DataSet object) of SQL run from PowerShell

我正在尝试从 Power Shell(在我的 windows 7 64 位桌面上)运行 SQL 并且远程数据库主机是 MS SQL 服务器 2012.

我 运行ning SQL1 通过调用函数 Get-ODBC-Data 得到字符串类型的单列。它可以有未知的行数(最多 20 行)。然后,我将这些列值中的每一个用作第二个函数 Get-ODBC-Data-Count 的参数 ($var1)。此函数 Get-ODBC-Data-Count 中的 SQL2 将在 where 子句中使用 $var1 给我计数。

代码为:

        function Get-ODBC-Data{       
           param(
           [string]$query=$('
                        SELECT col3
                        FROM [master].[sys].[table_name]'),         
           [string]$username='db_user_name',
           [string]$password='db_password'
           )
           $conn = New-Object System.Data.Odbc.OdbcConnection
           $conn.ConnectionString = "DRIVER={SQL Server};Server=123.456.78.90;Initial Catalog=master;Uid=$username;Pwd=$password;"
           $conn.open()
           $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
           $ds = New-Object system.Data.DataSet
           (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
           $conn.close()
           $ds.Tables[0]
        }

        function Get-ODBC-Data-Count{
           [parameter(Mandatory=$true)][string]$var1,
           param(
           [string]$query=$('
                        SELECT COUNT(*)
                        FROM [master].[sys].[table_name]                
                                        WHERE col2 = '$($var1)'
                                        ;
        '),
           [string]$username='db_user_name',
           [string]$password='db_password'
           )
           $conn = New-Object System.Data.Odbc.OdbcConnection
           $conn.ConnectionString = "DRIVER={SQL Server};Server=123.456.78.90;Initial Catalog=master;Uid=$username;Pwd=$password;"
           $conn.open()
           $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn)
           $ds = New-Object system.Data.DataSet
           (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
           $conn.close()
           $ds.Tables[0]
        }

$result = Get-ODBC-Data

$count_1 = Get-ODBC-Data-Count -var1 $result[0][0]
Write-Host "`$count_1[0]:" $count_1[0];
Write-Host "Message: Count of " $result[0][0] " is" $count_1[0];

$count_2 = Get-ODBC-Data-Count -var1 $result[1][0]
Write-Host "`$count_2:" $count_2[0];
Write-Host "Message: Count of " $result[1][0] " is" $count_2[0];

$count_3 = Get-ODBC-Data-Count -var1 $result[2][0]
Write-Host "`$count_3:" $count_3[0];
Write-Host "Message: Count of " $result[2][0] " is" $count_3[0];

如果我知道 SQL1.

结果中的行数,则此代码有效

我的问题: 我如何修改此代码,以便处理 SQL1 结果中的未知行数,我可以调用函数 Get-ODBC- SQL1?

每行的数据计数

这里有很多问题。 您正在构建 SQL 个字符串。不要这样做!请改用 SQL 参数! 你不必要地重复了很多代码。 您正在使用数据表,我会避免使用,至少在 powershell 中是这样。 您没有重新使用数据库连接。

在使用 SQL 时,总是非常努力地避免内部查询的循环。尝试考虑是否可以改写 SQL。

试试这个 SQL:

SELECT 
col2,
COUNT(<thePrimaryKeyColumnOfTheTable>)
FROM [master].[sys].[table_name]
GROUP BY col2

这应该会为您提供 col2 的所有不同值的计数。