在powershell中,如何将一个表附加到另一个表并导出到CSV?

时间:2015-05-29 21:43:33

标签: sql-server powershell powershell-v2.0

我对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

2 个答案:

答案 0 :(得分:0)

为什么您不能在查询中使用UNION来获取两个表中的合并数据

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

然后您可以使用Export-CSV filename.csv命令行开关将数据导出到CSV文件(或者),请参阅此帖子How to export data to CSV in PowerShell?

答案 1 :(得分:0)

虽然Union可能不适用于所有情况,但可以合并两个查询...只需将数字和日期的输出转换为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))

请确保您没有截断任何数据,并且可以将它们混合在一起。

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