PowerShell 执行 SQL 查询,将输出格式化为 excel。从输出中丢失一些数据

PowerShell execute SQL Query, Formatting output to excel. Losing some data from the output

我在 Powershell 中有一个 sql 查询 运行,它将结果导出到包含多个电子表格的 excel 工作簿。我现在已经解决了大部分问题,但是我有一个相当大的问题。

结果应 return 值填充 3 列。该查询在 PowerShell 之外工作并且 returns 是预期的结果,但我丢失了第三列的结果。对于经验丰富的人来说,这可能是显而易见的事情,但我很难过。

我一直在寻找一种方法来将我的查询结果从 PowerShell 回显或输出到屏幕,以帮助我确定我丢失数据的位置,但还没有骰子。

这是脚本:

$DSN='mydsn'
$DirectoryToSave = 'c:\report\'

$SQL1=@"

My Working Query

"@

if (!(Test-Path -path "$DirectoryToSave")) #create it if not existing 
  { 
  New-Item "$DirectoryToSave" -type directory | out-null 
  } 

$excel = New-Object -ComObject excel.application
$excel.visible = $True
$excel.DisplayAlerts = $False
$xl=$excel.Workbooks.Add()
$xl.Worksheets.Add()
$xl.Worksheets.Add()
$s1=$xl.sheets.Item(1)
$ws1 = $xl.sheets | where {$_.name -eq 'Sheet1'}
$ws1.name = $Project


$qt = $ws1.QueryTables.Add("ODBC;DSN=$DSN", $ws1.Range("A1"), $SQL1)  


if ($qt.Refresh()){
    $ws1.Activate()
    $ws1.Select()
    $excel.Rows.Item(1).HorizontalAlignment = $xlCenter
    $excel.Rows.Item(1).VerticalAlignment = $xlTop
    $excel.Rows.Item("1:1").Font.Name = "Calibri" 
    $excel.Rows.Item("1:1").Font.Size = 11 
    $excel.Rows.Item("1:1").Font.Bold = $true
    $excel.Columns.item("A:C").EntireColumn.AutoFit()
    $excel.Columns.item("B").NumberFormat=("$#,##0.00")

}

第三列中的值应该是数字,通常 returned 为 4 位数字值,用逗号分隔。每个单元格都可以有范围广泛的值 returned。这就是为什么我使用“$excel.Columns.item("A:C").EntireColumn.AutoFit()”自动调整。

有人知道我哪里出错了吗?

提前致谢!

现在,将 CASTVARCHAR 包裹在您上一个问题的查询的 STUFF 部分周围,即:

SELECT 
      t.CUSTOMER, 
      SUM(t.REVENUE) as REVENUE,
      CAST(
          STUFF(
                  (
                     SELECT ',' + Cast(s.work_order as varchar)
                     FROM tblname s
                     WHERE s.CUSTOMER = t.CUSTOMER
                     FOR XML PATH('')
                  ),1,1,''
          ) AS VARCHAR
      ) AS [WORK Order]
FROM tblname t
Group BY CUSTOMER

我目前无法解释为什么这会起作用,但我怀疑这是由于 ODBC 驱动程序中出现的某些 string/character 类型或编码时髦。当我有更多时间时,我会尝试更深入地研究。