Đây là một số quyền hạn sẽ làm những gì bạn đang theo đuổi; chỉ cần lên lịch bằng Trình lập lịch tác vụ của Windows:
Hàmfunction 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
Có thể có một cái gì đó được kích hoạt trên bất kỳ thay đổi nào; tức là bạn có thể tạo trình kích hoạt trên bảng, sau đó sử dụng xp_cmdshell
để thực thi một tập lệnh hoặc tương tự; nhưng điều đó sẽ dẫn đến các vấn đề về hiệu suất (các trình kích hoạt thường là một lựa chọn tồi nếu được sử dụng mà không được hiểu đầy đủ). Ngoài ra xp_cmdshell cũng mở ra cho bạn một số rủi ro bảo mật.
Có nhiều cách khác để đạt được điều này; hiện tại, tôi có một thứ cho PowerShell vì nó cung cấp cho bạn vô số sự linh hoạt với chi phí thấp.
Một tùy chọn khác có thể là sử dụng linked servers
để cho phép cơ sở dữ liệu nguồn của bạn cập nhật trực tiếp mục tiêu mà không cần CSV.