web-dev-qa-db-ja.com

SQL Server 2014からExcelにエクスポートする毎月のジョブを作成する

ここでは「SQL ServerからExcelにエクスポートする方法」を尋ねる質問がたくさんありますが、すべての答えは、私が知っていることと合わせて、問題を引き起こしています(ここでは64ビットシステム)。

毎月、クエリを6回実行する(2010年、2011年から年を変更する)開発者がいます。次に、結果をコピーしてExcelスプレッドシートに貼り付けます。

このデータをSQL Server 2014からExcelにエクスポートするときに問題が発生します。

これはクエリです:

_SELECT 
R.numero,
R.ano,
R.data 'data abertura',
R.datahora_conclusao  'data conclusão',
R.datahora_emissao 'data emissão',
S.[status],
(ins.INSTITUTO +
            ' - ' + dir.DIRETORIA + 
            (CASE WHEN NOT nuc.NUCLEO IS NULL THEN  ' - ' + nuc.NUCLEO  ELSE '' END) +
            (CASE WHEN NOT equ.EQUIPE IS NULL THEN ' - ' + equ.EQUIPE ELSE '' END)) AS UNIDADE,
N.codigo 'codigo natureza exame',
Case E.cod_estadopreservacao when 1 then 'Preservado' when 2 then 'Não Preservado' else 'Laborátorio' end 'Local Exame',

u.nome 'Perito Designado'
FROM tbReps R 
LEFT Join tbExames E on E.cod_rep = R.cod_rep
LEFT JOIN tbUsuarios U ON U.cod_usuario = R.cod_perito_primeiro
LEFT JOIN tbUnidades               AS uni WITH(NOLOCK) ON R.cod_unidade = uni.cod_unidade
LEFT JOIN lstUnidadesInstitutos AS ins WITH(NOLOCK) ON uni.cod_instituto = ins.cod_instituto
LEFT JOIN lstUnidadesDiretorias AS dir WITH(NOLOCK) ON uni.cod_instituto = dir.cod_instituto AND uni.cod_diretoria = dir.cod_diretoria
LEFT JOIN lstUnidadesNucleos AS nuc WITH(NOLOCK) ON uni.cod_diretoria = nuc.cod_diretoria AND uni.cod_nucleo = nuc.cod_nucleo 
LEFT JOIN lstUnidadesEquipes AS equ WITH(NOLOCK) ON uni.cod_nucleo = equ.cod_nucleo and uni.cod_equipe = equ.cod_equipe
LEFT JOIN lstNaturezasExame N ON R.cod_naturezaexame = N.cod_naturezaexame
LEFT JOIN lstStatus S ON S.cod_status = R.cod_status
WHERE  year(r.data) = 2016 and r.data <= '2016-04-30 23:59:59' 
order by data
_

これを年ごとに区切って、Excelファイルに直接インポートするものを考えています。 6つのテーブル(2010 ... 2011 ... 2012)を作成し、_Task > Export_プロセスを使用してから削除することをお勧めします。しかし、私はこれを行うためのより良い(そしてより正確な)方法があると思います。

どのOLE.DBプロバイダーを使用すればよいですか?これを行うスクリプトはありますか?私が知らないいくつかの手順?

私はどこでもwith (nolock)をテスト目的でのみ使用しています。

2
Racer SQL

PowerShellを使用する方法です。

# Original Author : Bill Fellows (http://billfellows.blogspot.com/2011/03/powershell-export-query-to-csv.html)
# Modified by     : Kin Shah (http://dba.stackexchange.com/users/8783/kin)
                    # Added the -NoTypeInformation to remove "#TYPE System.Data.DataRow" from the header !

# http://www.vistax64.com/powershell/190352-executing-sql-queries-powershell.html
$server = "servername\INSTANCE1"  #YourServer Name e.g. server1\instance1
$database = "your_db_name"    #your database name
$query = "select some columns from table inner join other table on table.id = othertable.id"

# powershell raw/verbatim strings are ugly
# Update this with the actual path where you want data dumped
# change here to the path that you want
$extractFile = @"
C:\SQLtoExcel.csv  
"@

# Use windows authentication !!
$connectionTemplate = "Data Source={0};Integrated Security=SSPI;Initial Catalog={1};"
$connectionString = [string]::Format($connectionTemplate, $server, $database)
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString

$command = New-Object System.Data.SqlClient.SqlCommand
$command.CommandText = $query
$command.Connection = $connection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $command
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$connection.Close()

# dump the data to a csv
# http://technet.Microsoft.com/en-us/library/ee176825.aspx
# -NoTypeInformation will remove the first #TYPE System.Data.DataRow
$DataSet.Tables[0] | Export-Csv $extractFile  -NoTypeInformation

以下も参照してください。

Powershellを介したマルチタブExcel ケビンFeaselによって

6
Kin Shah

私はおそらくこれに短い解決策をとるでしょう:

  1. SQLエージェントジョブを作成する
  2. Sqlcmdを使用してステップを作成し、 BCPクエリ にして、関連する年の.csvファイルとして保存します。
  3. デベロッパーに送信

彼が毎年別のワークシートまたは何かで欲しい場合、それは彼がExcelでマクロを作ることができるものです-実際のデータのダンプを与えるだけであなたの責任の範囲から十分であるはずです。

SSISを使用することもできますが、それをまだセットアップしていないと仮定すると、それ以外の場合はそもそもそれを選択したことになります。このジョブのためだけに環境とカタログをセットアップするのはおそらくやり過ぎです。そのため、1回限りの場合は、上記で十分です。

2
LowlyDBA