После SQL-запроса требуется помощь для возврата записей из ForEach - PullRequest
0 голосов
/ 28 марта 2019
[string] $Server= 'NERD\PAULSDB'
[string] $Database = "myPhotos"

$ShootDate= Get-Content -Path W:\W-SQL\PS\ShootDate.txt 

ForEach ($S_Date in $ShootDate){
$SqlQuery=@"
SELECT * FROM Target.U_PhotoYears where StrmydateTaken= '$S_Date'
"@
$resultsDataTable = ExecuteSqlQuery $Server $Database $SqlQuery 

function ExecuteSqlQuery ($Server, $Database, $SQLQuery) {
    $Datatable = New-Object System.Data.DataTable
    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Connection.ConnectionString = "server='$Server';database='$Database';Integrated Security=true;"
    $Connection.Open()
    $Command = New-Object System.Data.SQLClient.SQLCommand
    $Command.Connection = $Connection
    $Command.CommandText = $SQLQuery
    $Reader = $Command.ExecuteReader()
    $Datatable.Load($Reader)
    $Connection.Close()  
    return $Datatable
}

$data=$(foreach($a in $resultsDataTable)
        {
         $a.P_Filename+$a.myYearTaken
        }
    )
 $data 
}

Текстовый файл имеет четкий список дат всех фотосессий.Первый ForEach, похоже, получает данные нормально.Затем скрипт Powershell запрашивает базу данных myPhotos на основе значений из текстового файла.Запрос возвращает правильные записи для данной даты.

Однако я не могу получить записи из второго foreach в Export-Csv.
Любые предложения будут действительно оценены

1 Ответ

0 голосов
/ 28 марта 2019

Я думаю, что вы должны использовать массовую копию для отправки ваших данных во временную таблицу.это действительно лучше для производительности (вы делаете только 3 действия с базой данных, а не X действий => X датирует ваши файлы)

попробуйте это (не проверено)

$Connection=$null
$dttemporary=$null
$sqlBulkCopy=$null
$FinalData=$null
$Command=$null
$Reader=$null
$ErrorActionPreference = "Stop" #for stop script on first error

try
{

#create datatable for send data
$dttemporary = New-Object System.Data.Datatable
[void]$dttemporary.Columns.Add("mydate")

#add data to datatable
Get-Content -Path W:\W-SQL\PS\ShootDate.txt  | %{
$NewRow=$dttemporary.NewRow()
$NewRow["mydate"]=$_
$dttemporary.Rows.Add($NewRow)
}


#Create connexion
$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "server='$Server';database='$Database';Integrated Security=true;"

#create bulkcopy structure for send all data
$sqlBulkCopy = New-Object (“Data.SqlClient.SqlBulkCopy”) -ArgumentList $Connection
$sqlBulkCopy.DestinationTableName = “#TmpTable”

#Create datatable for final data 
$FinalData = New-Object System.Data.DataTable

#create command
$Command = $Connection.CreateCommand()

$Connection.Open()

#create temporary table (exsit while connexion stay open)
$Command.CommandText = "CREATE TABLE #TmpTable(mydate varchar(30) NOT NULL)"
$Command.ExecuteNonQuery()

#send data to temporary command with bulkcopy
$sqlBulkCopy.WriteToServer($dttemporary)

#query for get your final datas
$Command.CommandText = "SELECT * FROM Target.U_PhotoYears f1 inner join #TmpTable f2 on f1.StrmydateTaken=f2.mydate"
$Reader = $Command.ExecuteReader()
$FinalData.Load($Reader)

$Connection.Close()

#loop on data for traitment
$FinalData | %{
$_["P_Filename"].ToString() + $_["StrmydateTaken"].ToString()
}



}
catch
{
    $_.Exception.Message
}

finally
{
    if ($Connection) 
    {
        $Connection.Close()
        $Connection.Dispose()
    }

    if ($dttemporary) {$dttemporary.Dispose()}
    if ($sqlBulkCopy) {$sqlBulkCopy.Dispose()}
    if ($FinalData) {$FinalData.Dispose()}
    if ($Command) {$Command.Dispose()}
    if ($Reader) {$Reader.Dispose()}

}
...