sql >> Databasteknik >  >> RDS >> Sqlserver

Hur exporterar man automatiskt data från SQL Server 2012 till CSV-fil?

Här är några powershell som skulle göra vad du är ute efter; schemalägg det bara med 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 

Att få något utlöst på någon förändring är möjligt; d.v.s. du kan skapa en trigger på bordet och sedan använda xp_cmdshell att köra ett skript eller liknande; men det kommer att leda till prestandaproblem (triggers är ofta ett dåligt alternativ om de används utan att vara helt förstådda). Även xp_cmdshell öppnar upp för vissa säkerhetsrisker.

Det finns många andra sätt att uppnå detta; för närvarande har jag en grej för PowerShell eftersom det ger dig massor av flexibilitet med lite omkostnader.

Ett annat alternativ kan vara att undersöka hur du använder länkade servrar för att tillåta din källdatabas att direkt uppdatera målet utan behov av CSV.



  1. Hur man enkelt distribuerar TimescaleDB

  2. Laravel MySql DB-anslutning med SSH

  3. Fånga undantag för insättning av dubbletter av nyckel

  4. Beräkna koordinatavstånd i Laravel