通过PowerShell向SQL中插入数据时缺少行



我有一个脚本,它每5分钟从外部源(559)提取数据并将其加载到SQL服务器中,如下所示。该脚本似乎在大多数情况下都可以工作,但是每当我将前一天的结果与来自外部源的结果进行比较时,我总是在SQL中缺少几百到1000行(总共50,000到100,000行)。脚本在PowerShell中运行没有任何错误。

我有第二个相同的脚本与不同的开始/结束时间拉每天晚上运行的最后24小时,虽然这确实减少了缺失的行一点问题一直存在。

重复的值受到唯一键值的限制,该键值与每行中的其他值连接在一起。我已经尝试关闭在SQL和手动删除的唯一设置,但仍然有丢失的行。

我已经验证了我的唯一字符串实际上是唯一的转储结果从外部源到一个excel文件,并在那里连接,然后检查重复。这不会显示任何结果。

我已经能够准确地识别SQL中缺失的行,不幸的是,这些数据没有任何问题。

任何人能提供的任何帮助或见解都将非常感激。一个多月来我一直在为这件事抓狂,哈哈。

$reportid = Start-Five9Report -FolderName folder -ReportName report -EndDateTime (Get-Date).AddMinutes(-1) -StartDateTime (Get-Date).AddMinutes(-6)
$reportid
$reportresult = Get-Five9ReportResult -Identifier $reportid
$timeZoneOffset = 
@{
PST = 0
MST = 1
CST = 2
EST = 3
}

$localTimeZone = 'EST'
foreach($reportresult in $reportresult)
{
$VARDATE = $reportresult.Date
$VARTIME =  $reportresult.TIME
$VARDATETIME = "$($VARDATE)T$VARTIME"
$REPORTDATETIME = ([datetime]$VARDATETIME).AddHours($timeZoneOffset[$localTimeZone]).ToString('s')
$DATE = $REPORTDATETIME.Substring(0,10)
$HOUR = "$($REPORTDATETIME.Substring(11,3))00:00"
$MONTH = $REPORTDATETIME.Substring(5,2)
$TIME = $REPORTDATETIME.Substring(11,8)
$YEAR = $REPORTDATETIME.Substring(0,4)
${REPORT RESULTS} = $reportresult.("REPORT RESULTs")

$insertquery="
Insert into [dbo].[table]
(
[VALUE],
//many other values
)
values
(
'$($DATE -replace "'", "''")',
'$($HOUR -replace "'", "''")',
'$($MONTH -replace "'", "''")',
'$($TIME -replace "'", "''")',
'$($YEAR -replace "'", "''")',
'$($VALUE -replace "'", "''")',
'$(${SPACED VALUE} -replace "'", "''")',
//many other values
'$("${VALUE}${VALUE}${VALUE}${VALUE}${VALUE}${VALUE}${VALUE}${VALUE}")' //Combined from several fields to serve as unique key
)
GO
"
Invoke-Sqlcmd -ServerInstance 'server' -query $insertquery -Username user -Password ("password") -database database
};```

在运行中构建插入语句是一项艰苦的工作,因此可能会出现一些字符或字符串截断或发生一些奇怪的事情。

如果你能导入一个社区模块,你可以看看dbattools。他们有一个Write-DbaDbTableData,它可以接受一个PowerShell对象并将数据插入到SQL Server表中。

你可以这样做来建立一个PowerShell对象,然后将数据插入到表中。

您还可以将$results对象导出为csv或文本文件,然后将结果与SQL Server表行进行比较,看看是否仍然存在问题。

$results = @()
foreach($r in $reportresult) {
$results += [PSCustomObject]@{
value = ('"{0} {1} {2}' -f $r.Date.Hour, $r.Date.Date, $r.Results)
}
}
Write-DbaDbTableData -SqlInstance ServerName -Database pubs -InputObject $results -Table 'table'

最新更新