【问题标题】:Powershell / SQL Server / Import-CSVPowershell / SQL Server / Import-CSV
【发布时间】:2015-10-15 23:27:54
【问题描述】:

正在处理另一个工作脚本,我正在尝试从仅包含一列数据的 CSV 中读取数据。然后在查询SQL数据库时为每一项找到对应的ID。然后将结果(ID1,CSVID1)放入一个excel文件(我这部分工作正常)。

现在我遇到了一个问题,即如何在 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() 

【问题讨论】:

  • 它做了什么而不是工作?
  • 如果我将 $dataSet += 更改为 $dataSet = 它将运行脚本,但 excel 文件中的输出只是 foreach 循环的最后一个对象。

标签: sql-server powershell csv


【解决方案1】:

第一次分配给$dataSet 后,它的类型可能是not 数组,这意味着+= 运算符的行为与您预期的不完全一样。

您可以在开始分配之前将$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')

任何适合你的编码风格。

【讨论】:

  • 当我使用其中任何一个时,它仍然只输出 1 行。日志文件:00:01.26 Rows: 2 Columns: 3 Cells: 6
  • @BradleyScott 你能展示整个脚本吗?在您发布的 sn-p 中,您实际上没有对生成的 $dataSet 变量做任何事情
  • @MathiasRJessen 我已经添加了我在原始帖子中使用$dataSet 的位置。
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2013-09-23
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多