【问题标题】:How to export the output of a SQL query to Excel using PowerShell?如何使用 PowerShell 将 SQL 查询的输出导出到 Excel?
【发布时间】:2020-06-02 12:44:42
【问题描述】:

我有一个脚本,它从 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

【问题讨论】:

  • 也许改用 Invoke-SqlCmd 并将其输出分配给可以通过管道传输到 CSV 文件的变量,或者使用 Excel 中的 Text to Columns 功能根据分隔符将数据拆分为列结果?
  • 无法重现,我的测试导出创建了标准 CSV。没有看到查询和/或实际数据,这只是一个猜谜游戏。
  • 检查 Read-SqlTable 和这个 SO 问题stackoverflow.com/questions/33171372/…

标签: sql powershell


【解决方案1】:

真的有必要使用.net方法而不是“Invoke-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

(您可能需要事先安装 powershell module "SqlServer"

另一方面:根据使用的分隔符字符,在 Excel 中打开文件的方法可能是问题所在:重新启动 Excel 并选择“文件 > 打开 > ...”而不是双击。
如果两者都不起作用,您还可以选择 - 正如 LordPupazz 推荐的那样 - 您正在谈论的“单列”并使用“数据>文本到列”(+选择正确的分隔符)。

【讨论】:

  • 请查看我原始帖子的编辑版本,了解我收到的错误
【解决方案2】:

试试这个

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 

【讨论】:

    【解决方案3】:

    既然您已经在使用 PowerShell,何不试试dbatools.ioImportExcel

    dbatools 将帮助您以一种简单的方式从 SQL 中获取数据。这是一个例子(更多检查my series about dbatools

    $data = Invoke-DbaQuery -SqlInstance "localhost,1433" -Query "SELECT name,database_id from sys.databases"
    

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

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

    也可以在我的博客上查看how to use ImportExcel

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 2013-09-01
      • 2023-03-10
      相关资源
      最近更新 更多