如何使用PowerShell将SQL查询的输出导出到Excel?

如何使用PowerShell将SQL查询的输出导出到Excel?,sql,powershell,Sql,Powershell,我有一个脚本,它从SQL数据库中提取数据,并在excel中给出o/p,但o/p位于单列下。我想把它放在不同的地方。这是我的剧本: $SQLServer = "" $SQLDBName = "" $SqlQuery = "" $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server = $SQLS

我有一个脚本,它从SQL数据库中提取数据,并在excel中给出o/p,但o/p位于单列下。我想把它放在不同的地方。这是我的剧本:

     $SQLServer = ""
     $SQLDBName = ""
     $SqlQuery = ""
     $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
     $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True; User ID = $uid; Password = $pwd;"
     $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
     $SqlAdapter.Fill($DataSet)
     $DataSet.Tables[0] | out-file "C:\Users\sql.csv"
我还尝试了以下脚本:

    $SQLServer = ""
    $SQLDBName = ""
    $SqlQuery = "select request_number,actioneer,audited_date from form_submission where actioneer ='XXXX' AND audited_date between '2020-05-19 00:00:00:000' and '2020-05-19 19:16:00:000';"| | Select @{n='request_number';e={request_number}}, @{n='actioneer';e={actioneer}} ,@{n ='audited_date';e={audited_date}}
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server = $SQLServer; Database = 
    $SQLDBName; Integrated Security = True; User ID = $uid; Password = $pwd;"
    $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
    $SqlAdapter.Fill($DataSet)

    $DataSet.Tables[0] | out-file "C:\Users\sql.csv" 
但这会导致以下错误:

Exception calling "Fill" with "1" argument(s): "Must declare the scalar variable "@"."
At C:\Users\sraghur\Documents\sql powershell.ps1:12 char:1
+ $SqlAdapter.Fill($DataSet)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SqlException

是否真的需要使用.net方法而不是“调用Sqlcmd”?
我通常使用类似

Invoke-Sqlcmd -ServerInstance $strSQLServer -Database $strDatabase -QueryTimeout 180 -ConnectionTimeout 180 -query "select sqlcolumn1, sqlcolumn2, sqlcolumn3 from xxx" `
| Select-Object -Property sqlcolumn1, sqlcolumn2, sqlcolumn3 `
| Export-Csv "C:\Temp\SQLOutput.csv" -Encoding UTF8 -Delimiter ";" -NoTypeInformation
(您可能需要事先安装)

另一方面:根据使用的分隔符字符,在Excel中打开文件的方法可能会出现问题:重新启动Excel并选择“文件>打开>…”而不是双击。
如果两者都不起作用,您也可以按照LordPupazz的建议选择您所说的“单列”,并使用“数据>文本到列”(+选择正确的分隔符)。

试试这个

Import-Module -Name SqlServer -Force

#Download ImportExcel Module if you don't have it already: https://www.powershellgallery.com/packages/ImportExcel/7.1.0
Import-Module -Name "C:\Program Files\WindowsPowerShell\Modules\ImportExcel\ImportExcel.psm1" -force

##########################################################################################################################################################################################
#Create Excel File in Temp
##########################################################################################################################################################################################
$Folder = "C:\Temp";
$ReportName = "ReportName";

#$FileNameCSV = $Folder + "\" + $ReportName + ".csv"
$FileNameExcel = $Folder + "\" + $ReportName +"_"+ $(get-date -f MM-dd-yyyy) + ".xlsx"  

#$TestPath1 = Test-Path -Path $FileNameCSV;
$TestPath2 = Test-Path -Path $FileNameExcel;

#If($TestPath1 -eq $true){Remove-Item -Path $FileNameCSV -Force -ErrorAction Ignore};
If($TestPath2 -eq $true){Remove-Item -Path $FileNameExcel -Force -ErrorAction Ignore};

##########################################################################################################################################################################################
#Connect to SQL and load report table to PS variable
##########################################################################################################################################################################################
#Variables for your source SQL Server information
$SqlServer = "sqlserver.domain,port"
$SQLDB = "main"
$SQLQuery = "SELECT * FROM dbo.FOO"

#Wrap everything into a PS variable
$SQLProc = @{
    ServerInstance =  ""
    Database = ""
    Query = ""
}

#Set PS variable values
$SQLProc.ServerInstance = $SqlServer
$SQLProc.Database = $SQLDB
$SQLProc.Query = $SQLQuery

#Run SQL Query
$Results = Invoke-Sqlcmd @SQLProc


##########################################################################################################################################################################################
##Load data to Excel file on the specified Excel tab
##########################################################################################################################################################################################
#From the results dataset, select what columns you want in the Excel File
$Export = $Results | Select Column1,Column2,Column3
$Export | Export-Excel -Path $FileNameExcel -WorkSheetname "SheetName" -TableName "SQLData" -TableStyle Medium15 -AutoSize -BoldTopRow 

既然您已经在使用PowerShell,为什么不尝试使用它呢

dbatools将帮助您以一种简单的方式从SQL中获取数据。以下是一个示例(有关更多检查:

另一个将帮助您将CSV导出到XLSX

$data | Export-Excel -Path HowToExcel.xlsx -Show

请参见我的博客

或者改用Invoke SqlCmd并将其输出分配给可通过管道传输到CSV文件的变量,或者使用Excel中的“文本到列”功能根据结果中的分隔符将数据拆分为列?无法复制,我的测试导出创建了一个标准的CSV。如果看不到查询和/或实际数据,这是错误的一个猜谜游戏。检查阅读SqlTable,这个问题请查看我的原始帖子的编辑版本,以了解我收到的错误
$data | Export-Excel -Path HowToExcel.xlsx -Show