【问题标题】:In powershell, how can I append one table to another and export to CSV?在 powershell 中,如何将一个表附加到另一个表并导出到 CSV?
【发布时间】:2015-08-12 21:48:02
【问题描述】:

我对 Powershell 比较陌生,但这是我想要做的:

我需要进行多个 SQL 查询并将结果存储到同一个 csv 中的所有查询中。使用 Powershell 3.0 我可以使用 Export-CSV -Append,但不幸的是我需要使用 Powershell 2.0。这是我现在拥有的。

#Connection Strings
$Database = "DB"
$Server = "localhost"

#Export File
$AttachmentPath = "C:\Users\Administrator\Desktop\SQLData.csv"

# Connect to SQL and query data, extract data to SQL Adapter
$SqlQuery = "select * from DB.dbo.DB1"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;Integrated Security = True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$nRecs = $SqlAdapter.Fill($DataSet)
$nRecs | Out-Null

#Populate Hash Table
$objTable = $DataSet.Tables[0]

#Export Hash Table to CSV File
$objTable | Export-CSV $AttachmentPath

Write-Output "REPORT: Successfully created ${AttachmentPath}"

这将成功创建我的表并将其导出到如下所示的 csv 文件中:

Table 1
----------------
col1(int)  col2(string)  col3(string)
col1(int)  col2(string)  col3(string)

但现在我想以完全相同的方式运行不同的查询

# Connect to SQL and query data, extract data to SQL Adapter
$SqlQuery = "select * from DB.dbo.DB2"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;Integrated Security = True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$nRecs = $SqlAdapter.Fill($DataSet)
$nRecs | Out-Null

#Populate Hash Table
$objTable = $DataSet.Tables[0]

#IN POWERSHELL 3.0 THIS WOULD WORK
$objTable | Export-CSV $AttachmentPath -Append

并将其附加到第一个表中。最终的 CSV 如下所示:

Table 1
----------------
col1(int)  col2(string)  col3(string)
col1(int)  col2(string)  col3(string)

Table 2
----------------
col1(string)  col2(int)  col3(int)
col1(string)  col2(int)  col3(int)

我找不到任何方法来做到这一点,感谢任何帮助!

编辑

通过将第二个查询导出到 csv 找到了解决方法,

$objTable | Export-CSV $AttachmentPath

然后我使用 Get-Content 和 Add-Content cmdlet 附加到第一个 csv。这是hacky,但它的工作原理。如果你有什么更好的告诉我!

$file2=Get-Content $AttachmentPath

Add-Content "SQLData.csv" "`n"
Add-Content "SQLData.csv" $file1

【问题讨论】:

    标签: sql-server powershell powershell-2.0


    【解决方案1】:

    为什么你不能像下面这样在查询中使用UNION 从两个表中获取合并数据

    $SqlQuery = "select * from DB.dbo.DB1 UNION select * from DB.dbo.DB2"
    

    然后您可以使用Export-CSV filename.csv commandlet 将数据导出到 CSV 文件(或)请参阅此线程 How to export data to CSV in PowerShell?

    【讨论】:

    • 我简化了问题的查询,但我认为我不能使用联合,因为第一个查询返回的列与第二个查询返回的列具有不同的数据类型,我按不同的事物分组和排序。另外值得注意的是,我将使用两个以上的表来执行此操作。我有一个脚本,我需要将 15 个表组合成一个 CSV。
    • 虽然联合可能不适用于所有情况,但可以合并两个查询...只需将数字和日期的输出转换为 varchar/char。 > Blockquote Table 1 ---------------- SELECT Cast(col1(int) as varchar(7)) col1, col2(string) col3(string) FROM [Table 1] UNION ALL ---------------- col1(string) col2(int) col3(int) col1(string) col2(int) col3(int)
    【解决方案2】:

    虽然联合可能不适用于所有情况,但可以合并两个查询...只需将数字和日期的输出转换为 varchar/char。

    SELECT Cast(col1(int) as varchar(7)) as col1, col2(string) as col2, col3(字符串) 来自 [表 1] UNION ALL SELECT col1(string), Cast(col2(int) as varchar(7)), Cast(col3(int) as varchar(7))

    只要确保您没有截断任何数据,您就可以将它们混合在一起。

    当然,在 powershell 中加入 15 个表似乎更容易维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2014-10-11
      • 2020-02-02
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多