Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como exportar dados automaticamente do SQL Server 2012 para o arquivo CSV?


Aqui está um powershell que faria o que você procura; basta agendá-lo usando o Agendador de Tarefas do Windows:
function Execute-SQLQuery {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$DbInstance
        ,
        [Parameter(Mandatory = $true)]
        [string]$DbCatalog
        ,
        [Parameter(Mandatory = $true)]
        [string]$Query
        ,
        [Parameter(Mandatory = $false)]
        [int]$CommandTimeoutSeconds = 30 #this is the SQL default
    )
    begin {
        write-verbose "Call to 'Execute-SQLQuery': BEGIN"
        $connectionString = ("Server={0};Database={1};Integrated Security=True;" -f $DbInstance,$DbCatalog)
        $connection = New-Object System.Data.SqlClient.SqlConnection
        $connection.ConnectionString = $connectionString
        $connection.Open()    
    }
    process {
        write-verbose "`n`n`n-----------------------------------------"
        write-verbose "Call to 'Execute-SQLQuery': PROCESS"
        write-verbose $query 
        write-verbose "-----------------------------------------`n`n`n"
        $command = $connection.CreateCommand()
        $command.CommandTimeout = $CommandTimeoutSeconds
        $command.CommandText = $query
        $result = $command.ExecuteReader()
        $table = new-object “System.Data.DataTable”
        $table.Load($result)
        Write-Output $table
    }
    end {
        write-verbose "Call to 'Execute-SQLQuery': END"
        $connection.Close()
    }
}

Execute-SQLQuery -DbInstance 'myServer\InstanceName' -DbCatalog 'myDatabase' -Query @"
select Mxmservsite.siteid as Marker_ID
 , mxmservsite.name as Name
 , 'SITE' as Group
 , '3' as Status
 , '' as Notes
 , mxmservsite.zipcode as Post_Code
 , 'GB' as Country
 , '' as Latitude
 , '' as Longitude
 , '' as Delete
 From mxmservsite --this wasn't in your original code
 Where dataareaid='ansa'
 "@ | Export-CSV '.\MyOutputFile.csv' -NoType 

Ter algo acionado em qualquer mudança é possível; ou seja, você pode criar um gatilho na tabela e usar xp_cmdshell executar um script ou similar; mas isso levará a problemas de desempenho (os gatilhos geralmente são uma opção ruim se usados ​​sem serem totalmente compreendidos). Além disso, o xp_cmdshell abre alguns riscos de segurança.

Existem muitas outras maneiras de conseguir isso; atualmente, tenho uma queda pelo PowerShell, pois oferece muita flexibilidade com pouca sobrecarga.

Outra opção pode ser usar servidores vinculados para permitir que seu banco de dados de origem atualize diretamente o destino sem a necessidade de CSV.