Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie exportiert man automatisch Daten von SQL Server 2012 in eine CSV-Datei?

Hier ist eine Powershell, die das tun würde, wonach Sie suchen; Planen Sie es einfach mit dem Windows-Taskplaner:

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 ist möglich, bei jeder Änderung etwas auslösen zu lassen; Das heißt, Sie könnten einen Trigger für die Tabelle erstellen und dann xp_cmdshell um ein Skript oder ähnliches auszuführen; aber das wird zu Leistungsproblemen führen (Trigger sind oft eine schlechte Option, wenn sie verwendet werden, ohne vollständig verstanden zu werden). Auch xp_cmdshell setzt Sie einigen Sicherheitsrisiken aus.

Es gibt viele andere Möglichkeiten, dies zu erreichen; derzeit habe ich ein Faible für PowerShell, da es Ihnen viel Flexibilität mit wenig Overhead bietet.

Eine weitere Option könnte darin bestehen, die Verwendung von verknüpften Servern zu prüfen damit Ihre Quelldatenbank das Ziel ohne CSV direkt aktualisieren kann.