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

Hvordan eksporterer man automatisk data fra SQL Server 2012 til CSV-fil?

Her er noget powershell, der ville gøre det, du leder efter; bare planlæg det ved hjælp af Windows Task Scheduler:

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 

At få noget udløst ved enhver ændring er muligt; dvs. du kan oprette en trigger på bordet og derefter bruge xp_cmdshell at udføre et script eller lignende; men det vil føre til ydeevneproblemer (triggere er ofte en dårlig mulighed, hvis de bruges uden at blive fuldt ud forstået). Også xp_cmdshell åbner dig for nogle sikkerhedsrisici.

Der er mange andre måder at opnå dette på; i øjeblikket har jeg noget med PowerShell, da det giver dig masser af fleksibilitet med lidt overhead.

En anden mulighed kan være at undersøge brugen af ​​linkede servere for at tillade din kildedatabase at opdatere målet direkte uden behov for CSV.



  1. Sådan opretter du tabel postgresql, når du starter med docker compose

  2. Hvor mange forespørgsler er for mange?

  3. Hvorfor tager en forespørgsel med IN (underforespørgsel) længere tid end en forespørgsel med IN (diskret liste)

  4. Lagring af en afstandsmatrix i DB