Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment exporter automatiquement les données de SQL Server 2012 vers un fichier CSV ?

Voici un powershell qui ferait ce que vous recherchez; planifiez-le simplement à l'aide du planificateur de tâches 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 

Avoir quelque chose déclenché sur n'importe quel changement est possible; c'est-à-dire que vous pouvez créer un déclencheur sur la table, puis utiliser xp_cmdshell pour exécuter un script ou similaire ; mais cela va entraîner des problèmes de performances (les déclencheurs sont souvent une mauvaise option s'ils sont utilisés sans être entièrement compris). De plus, xp_cmdshell vous expose à certains risques de sécurité.

Il existe de nombreuses autres façons d'y parvenir; actuellement, j'ai un faible pour PowerShell car il vous donne beaucoup de flexibilité avec peu de frais généraux.

Une autre option peut être d'utiliser des linked servers pour permettre à votre base de données source de mettre à jour directement la cible sans avoir besoin de CSV.