Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come esportare automaticamente i dati da SQL Server 2012 in file CSV?

Ecco un po' di powershell che farebbe quello che stai cercando; basta pianificarlo utilizzando l'Utilità di pianificazione di 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 

Avere qualcosa attivato su qualsiasi cambiamento è possibile; ad esempio puoi creare un trigger sul tavolo, quindi utilizzare xp_cmdshell eseguire uno script o simili; ma questo porterà a problemi di prestazioni (i trigger sono spesso una cattiva opzione se usati senza essere completamente compresi). Inoltre xp_cmdshell ti espone ad alcuni rischi per la sicurezza.

Ci sono molti altri modi per raggiungere questo obiettivo; attualmente ho un debole per PowerShell in quanto ti offre molta flessibilità con un sovraccarico minimo.

Un'altra opzione potrebbe essere quella di esaminare l'utilizzo di linked servers per consentire al database di origine di aggiornare direttamente la destinazione senza bisogno di CSV.