如何从 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 的所有不同值的计数。
我正在尝试从 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 的所有不同值的计数。