Экспорт SQL данных в Excel - лучший подход? - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время я работаю над автоматизацией, которая требует экспортировать sql результатов, чтобы превзойти данные. Я хочу сделать это с помощью запроса SQL. Я знаю несколько вариантов, как показано ниже, но прежде чем я начну изучать эти вещи. Я хотел бы знать наилучший из возможных подходов.

PS - Было бы действительно здорово, если бы был способ динамически создавать Excel во время выполнения запроса и экспортировать данные в несколько листов Excel.

  1. OPENROWSET
  2. bcp_cmd

Ответы [ 3 ]

0 голосов
/ 22 февраля 2020

Некоторое время назад я собрал воедино этот скрипт Powershell.
Он запрашивает sql данные сервера, сохраняет как csv, форматирует их и сохраняет как xls, затем отправляет по почте через smtp.
Вы можете настроить windows запланированное задание для его автоматизации.

Также имеется модуль import xls для powershell.

Import-Module Sqlps -DisableNameChecking;

#execute mysql query as excel
$Server = "DB SERVER";
$Database = "DBNAME";

$Query = @"
*SELECT QUERY HERE*
"@
$a = Get-Date
#note: if you run get-location from ide, it will use the ide path instead of the script path 
$currentLocation = Split-Path -Parent $PSCommandPath
$FilePath = $currentLocation + "\CSVName.csv"
$SavePath = $currentLocation + "\XLSFileName" +$a.Day+ $a.Month + $a.Year + ".xls"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $Server; Database = $Database; User ID = DBUSERNAME; Password = PASSWORD";
$SqlConnection.Open()
$sqlcmd = $SqlConnection.CreateCommand()
$sqlcmd.Connection = $SqlConnection
$sqlcmd.CommandText = $Query


$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $sqlcmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$DataSet.Tables[0] | Export-Csv -notypeinformation $FilePath


$SqlConnection.Close()
#Invoke-Sqlcmd -Query $Query -ConnectionString $SqlConnection.ConnectionString | Export-Csv -notypeinformation $FilePath

#release memory function
function Release-Ref($ref){
    ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

#format excel to display correct date
$objExcel = new-object -comobject excel.application  
$objWorkbook = $objExcel.Workbooks.open($FilePath)
$objWorksheet = $objWorkbook.Worksheets.Item(1) 
$objRange = $objWorksheet.UsedRange
[void] $objRange.EntireColumn.Autofit()
$objWorkbook.Saved = $True
$objExcel.DisplayAlerts = $False
$objWorkbook.SaveAs($SavePath,1)
$objExcel.Quit()

#release memory
Release-Ref($objWorksheet) 
Release-Ref($objWorkbook) 
Release-Ref($objExcel)

#create mail
$smtpServer = "SMTPSERVER"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)

$att = new-object Net.Mail.Attachment($SavePath)
$msg = new-object Net.Mail.MailMessage
$msg.Subject = "EMAIL SUBJECT"
$msg.From = "FROM EMAIL"
#$msg.To.Add("TO EMAIL 1")
$msg.To.Add("TO EMAIL 2")
$msg.Body = @"
Hi,

MSG BODY HERE

Best Regards
"@
$msg.Attachments.Add($att)

$smtp.Send($msg)
$att.Dispose()

0 голосов
/ 02 марта 2020

Загрузите и установите 64-разрядную или 32-разрядную версию драйвера в зависимости от того, что вы установили.

https://www.microsoft.com/en-us/download/details.aspx?id=13255

Затем вы должно быть в состоянии выполнить это.

insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\testing.xls;', 
    'SELECT * FROM [SheetName$]') select * from SQLServerTable

Примечание: это может не сработать, если у вас одна 32-битная технология и одна 64-битная технология. В этом случае вам может понадобиться какой-то обходной путь.

См. Эту ссылку для получения дополнительных идей о том, как интегрировать SQL Сервер и Excel.

https://solutioncenter.apexsql.com/how-to-import-and-export-sql-server-data-to-an-excel-file/

0 голосов
/ 22 февраля 2020

Вы можете CREATE VIEW и использовать это представление в Excel 2016 при подключении к данным через PowerQuery. Представления являются предпочтительными, поскольку они управляются независимо на сервере и предоставляют результаты данных в реальном времени, не требуя встраивания полного запроса в файл Excel. Результирующий набор существует в книге как таблица с поддержкой refre sh. Результаты, которые необходимо записать, должны быть получены с помощью новых рабочих книг или UPDATE на сервер в отдельном сценарии.

enter image description here

В Редактор PowerQuery, вкладка «Главная», нажмите Advanced Editor. Строка подключения к базе данных и вызов на сервер ниже. Вы также можете динамически передавать параметры из таблицы Excel в запрос, используя таблицу в Name Manager.

Excel tab, table name: tbl_Parameters

    A         B
1 StartDate  01/01/2020
2 EndDate    02/01/2020
let
   Source = Sql.Database("ServerName" , "Database", [Query="

DECLARE @Start_Date AS datetime
DECLARE @End_Date AS datetime

SET @Start_Date = '"&StartDate&"'
SET @End_Date = '"&EndDate&"'


SELECT * FROM uvw_product
WHERE item_sold_date BETWEEN
@Start_Date AND @End_Date

"])
in
   Source
...