sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo exportar automáticamente datos de SQL Server 2012 a un archivo CSV?

Aquí hay un powershell que haría lo que buscas; solo prográmelo usando el Programador de tareas de 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 

Es posible tener algo desencadenado en cualquier cambio; es decir, puede crear un disparador en la tabla y luego usar xp_cmdshell para ejecutar un script o similar; pero eso conducirá a problemas de rendimiento (los disparadores a menudo son una mala opción si se usan sin entenderlos completamente). Además, xp_cmdshell lo expone a algunos riesgos de seguridad.

Hay muchas otras formas de lograr esto; actualmente me gusta PowerShell, ya que te brinda mucha flexibilidad con poca sobrecarga.

Otra opción puede ser considerar el uso de linked servers para permitir que su base de datos de origen actualice directamente el destino sin necesidad de CSV.