Как зациклить результат (объект system.Data.DataSet) SQL запускается из PowerShell - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь запустить SQL из Power Shell (который находится на моем 64-битном рабочем столе Windows 7), а удаленный хост базы данных - MS SQL Server 2012.

Я запускаю SQL1, вызывая функцию Get-ODBC-Data, который даст мне один столбец типа string.Может иметь неизвестное количество строк (до 20).Затем я использую каждое из этих значений столбца в качестве параметра ($ var1) для второй функции Get-ODBC-Data-Count.SQL2 в этой функции Get-ODBC-Data-Count даст мне счет с использованием $ var1 в предложении where.

Код:

        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-Data-Count для каждой строки SQL1?

1 Ответ

0 голосов
/ 18 мая 2018

Здесь много вопросов.Вы строите строки SQL.Не делай этого!Вместо этого используйте параметры SQL!Вы повторяете много кода без необходимости.Вы используете таблицы данных, которых я бы избегал, по крайней мере в PowerShell.Вы не используете соединение с базой данных повторно.

Всегда старайтесь изо всех сил избегать циклов с запросом внутри при работе с SQL.Попробуйте и подумайте, можете ли вы вместо этого переписать SQL.

Попробуйте этот SQL:

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

Это должно дать вам подсчет всех различных значений col2.

...