首页 > 解决方案 > 通过 PowerShell 将数据插入 SQL 时缺少行

问题描述

我有一个脚本,它每 5 分钟从外部源 (five9) 提取数据并将其加载到 SQL 服务器中,如下所示。该脚本似乎在大多数情况下都有效,但是每当我将前一天的结果与外部源的结果进行比较时,我总是在 SQL 中少几百到一千行(总共 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

};```

标签: sqlsql-serverpowershellfive9

解决方案


推荐阅读