2015-10-15 3 views
0

Работа над другим скриптом для работы, и я пытаюсь читать из CSV, содержащего только один столбец данных. И затем для каждого элемента, чтобы найти соответствующий ID при запросе базы данных SQL. Затем поместите результат (ID1, CSVID1) в файл excel (у меня эта часть работает нормально).Powershell/SQL Server/Import-CSV

Теперь я столкнулся с вопросом о том, как заполнить набор данных внутри цикла foreach.

$excelAssets = Import-Csv .\test.csv -Header assetId | Foreach-Object { 
    $assetId = $_.assetId 
    # SQL Query Variables 
    $query = "SELECT AssetId AS AssetID, BrandId AS BrandID FROM [AssetLibrary_BrandAsset] WHERE AssetId = $assetId" 

    $connection = New-SqlConnection -Server $dataSource -Database $dataBase 

    #Execute the SQL commands and place the results in dataset 
    if ($connection.State -eq 'Open') 
    { 
     $swLap = Start-Elapsed $sw "Executing SQL Query" 
     Write-Verbose "$query"; 
     $dataSet += Invoke-SQLQuery -connection $connection -query $query -ExecutionTimeout '0' 
     $i++ 
     $connection.Close(); 
     End-Elapsed $sw $swLap  
    } ELSE { 
     Write-Error "$($(Format-Elapsed $swLap)) SQL Connection Not Open - Exiting..."; 
     exit; 
    } 
} 

Теперь $dataSet += не работает, и я много раз гугла, чтобы попытаться найти ответ на эту проблему. Любая помощь приветствуется.

Использование типа $dataSet

$dataTable = new-object "System.Data.DataTable" "Results" 
$dataTable = $dataSet.Tables[0] 

$rowDT = $dataTable.Rows.Count; 
$colDT = $dataTable.Columns.Count; 
Write-Host -NoNewLine "$(Format-Elapsed $sw.Elapsed) Rows: "; 
Write-Host -NoNewLine "$($rowDT+1)" -ForegroundColor "Green"; 
Write-Host -NoNewLine " Columns: " 
Write-Host -NoNewLine "$($colDT+1)" -ForegroundColor "Green"; 
Write-Host -NoNewLine " Cells: " 
Write-Host "$(($colDT+1)*($rowDT+1))" -ForegroundColor "Green"; 


#Create a 2D Array of the DataTable 
# http://stackoverflow.com/questions/13184191/fastest-way-to-drop-a-dataset-into-a-worksheet 
$tableArray = New-Object 'object[,]' $rowDT, $colDT; 
$swLap = Start-Elapsed $sw "DataTable transformation" 
# i = row and j = column 
for ($i=0;$i -lt $rowDT; $i++) 
{ 
    #Write-Progress -Activity "Transforming DataTable" -status "Row $i" -percentComplete ($i/$rowDT*100) 
    for ($j=0;$j -lt $colDT; $j++) 
    { 
     $tableArray[$i,$j] = $dataTable.Rows[$i].Item($j).ToString(); 
    }  
} 

End-Elapsed $sw $swLap 

$rowOffset = 1; $colOffset = 1;# 1,1 = "A1" 

# Write out the header column names 
for ($j=0;$j -lt $colDT; $j++) 
{ 
    $ActiveWorksheet.cells.item($rowOffset, $j+1) = $dataTable.Columns[$j].ColumnName; 
} 
$headerRange = $ActiveWorksheet.Range($ActiveWorksheet.cells.item($rowOffset, $colOffset), $ActiveWorksheet.cells.item($rowOffset, $colDT+$colOffset-1)); 
$headerRange.Font.Bold = $false 
$headerRange.Interior.Color = $headingColour 
$headerRange.Font.Name = $headingFont 
$headerRange.Font.Color = $headingFontColour 

$rowOffset++; 

# Extract the data to Excel 
$tableRange = $ActiveWorksheet.Range($ActiveWorksheet.cells.item($rowOffset, $colOffset), $ActiveWorksheet.cells.item($rowDT+$rowOffset-1, $colDT+$colOffset-1)); 
$tableRange.Cells.Value2 = $tableArray; 

# Resize the columns in Excel 
$swLap = Start-Elapsed $sw "Resize Excel Worksheet" 
$wholeRange = $ActiveWorksheet.UsedRange 
$wholeRange.EntireColumn.AutoFit() | Out-Null 
End-Elapsed $sw $swLap 

# Save Excel workbook 
$ActiveWorkbook.SaveAs("$OutputFile") 
$ActiveWorkbook.Close() 
+0

Что он делает вместо работы? –

+0

Если я сменил '$ dataSet + =' на '$ dataSet =', он запустит скрипт, но вывод в файле excel будет только последним объектом цикла foreach. –

ответ

1

После присвоения $dataSet в первый раз, это, вероятно, не массив, а это означает, что оператор += не ведет себя точно так, как вы ожидаете.

Вы можете инициализировать $dataSet как пустой массив, прежде чем начать присвоение ему:

Import-Csv .\test.csv -Header assetId | Foreach-Object -Begin {$dataSet = @()} -Process { 
    # rest of script in here 
} -End {return $dataSet} 

или вы можете бросить его во время назначения:

[array]$dataSet += Invoke-SQLQuery -connection $connection -query $query -ExecutionTimeout '0' 

наконец, альтернативное решение было бы убедитесь, что выход от Invoke-SQLQuery рассматривается как массив, прежде чем назначить его $dataSet:

$dataSet += @(Invoke-SQLQuery -connection $connection -query $query -ExecutionTimeout '0') 

Независимо от того, подходит ли ваш стиль кодирования.

+0

Когда я использую любой из них, он все еще выводит только 1 строку. Файл журнала: '00: 01.26 Ряды: 2 Столбцы: 3 Ячейки: 6' –

+0

@BradleyScott Вы могли бы показать весь скрипт? Нигде в опубликованном фрагменте вы ничего не делаете с результирующей переменной '$ dataSet' –

+0

@MathiasRJessen Я добавил, где я использую' $ dataSet' в исходном сообщении. –