これは、あなたが求めていることを行うパワーシェルです。 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
変更時に何かをトリガーすることは可能です。つまり、テーブルにトリガーを作成し、xp_cmdshell<を使用できます。 /コード>
スクリプトなどを実行する。しかし、それはパフォーマンスの問題につながります (完全に理解されていない状態でトリガーを使用すると、多くの場合、不適切なオプションになります)。また、xp_cmdshell を使用すると、いくつかのセキュリティ リスクが生じます。
これを実現する方法は他にもたくさんあります。現在、PowerShell を使用しています。オーバーヘッドがほとんどなく、柔軟性が高いからです。
別のオプションとして、リンク サーバー
の使用を検討することもできます。
CSV を必要とせずに、ソース データベースがターゲットを直接更新できるようにします。