2015-02-24 40 views
1

我有一个在Powershell中运行的SQL查询,它将结果导出到一个带有多个电子表格的Excel工作簿。我现在大部分问题都已经解决,但是我有一个相当大的问题。PowerShell执行SQL查询,将输出格式化为excel。从输出丢失一些数据

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

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

这里是脚本:

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

[email protected]" 

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") 

} 

在第三式柱的值应该是数字,并且通常返回由逗号分隔的一个4位值。每个单元格可以有多种返回的值。这就是为什么我使用“$ excel.Columns.item(”A:C“)。EntireColumn.AutoFit()”自动设置的原因。

任何人有任何想法我错了?

谢谢提前!

+0

这是一个应该填充第3列的数据的例子。每行都会像这样填充:** 4084,4207,4296,4312,4324,4325,4356,4363,4364,4368,4369,4377, 4390,4403,4411,4419,4422,4425,4448,4453,4459,4476,4497,4516,4518,4534,4536,4547,4579,4583,4584,4587,4602,4607,4635,4641,4643, 4672,4675,4679,4687,4689,4697,4708,4736,4839,4975,4998,5005,5064,5080,5102,5151,5172,5180,5223,5237,5238 ** – 2015-02-24 16:25:47

+0

您的意思是说,将根据您想要的结果从这个问题?:http://stackoverflow.com/questions/28118034/ms-sql-query-assistance – Kev 2015-02-24 19:56:09

+0

我的意思是,当我运行我的查询以外的PowerShell时,我得到3列的数据。第一个是公司名称|美元价值|发票。有时在这种情况下涉及多个发票,他们输出为我的示例(没有包装所有结果在一行中)。当我运行我应该将结果输出到excel工作表的ps脚本时,我会得到我期望的所有内容,除了发票号码。即使标题在那里,但根本没有数据。 – 2015-02-24 20:12:28

回答

0

现在,从以前的问题,即紧裹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驱动程序中进行编码时髦。当我有更多时间时,我会尽力深入研究。

+0

真棒@Kev非常感谢,这正是它所需要的! – 2015-02-24 21:12:03

+0

@joeblow - 不客气。你知道你也可以+1被接受的答案:) – Kev 2015-02-24 21:14:37

+0

我立刻接受了答案,但我认为我需要更高的声望来投票。让我知道如果我有这个错误,我会很乐意尽快这样做。再次感谢你的帮助! – 2015-02-25 14:40:52