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()”自动调整。
有人知道我哪里出错了吗?
提前致谢!
现在,将 CAST
到 VARCHAR
包裹在您上一个问题的查询的 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 类型或编码时髦。当我有更多时间时,我会尝试更深入地研究。
我在 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()”自动调整。
有人知道我哪里出错了吗?
提前致谢!
现在,将 CAST
到 VARCHAR
包裹在您上一个问题的查询的 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 类型或编码时髦。当我有更多时间时,我会尝试更深入地研究。