我有这样的代码,它用excel表中的值更新表中的几列。我尝试使用sqlserver模块来实现这一点,但我想知道是否有任何方法可以使用DBATOOLS模块来执行操作?
for ($row8 = 9; $row8 -lt 40; $row8++) {
if ([string]::IsNullOrEmpty($ws3.Cells.Item($row8, 3).Value2)){break} else {
$sqlCmd.CommandText = "UPDATE $Table7 SET STCW_Cert_Held = $ws3.Cells.Item($row8, 18).Value2,
ISPS = $ws3.Cells.Item($row8, 19).Value2,
Marine_Medical_Exp = $ws3.Cells.Item($row8, 20).Value2,
Petronas_Medical_Exp = $ws3.Cells.Item($row8, 21).Value2,
OSP_Exp = $ws3.Cells.Item($row8, 22).Value2,
Shell_SafetyPassport_Exp = $ws3.Cells.Item($row8, 23).Value2,
Boseit_Exp = $ws3.Cells.Item($row8, 24).Value2,
BT_STCW_Exp = $ws3.Cells.Item($row8, 25).Value2,
Rigging_Slinging_Exp = $ws3.Cells.Item($row8, 26).Value2,
FoodHandling_Exp = $ws3.Cells.Item($row8, 27).Value2,
H2S_Exp = $ws3.Cells.Item($row8, 28).Value2,
COC_Exp = $ws3.Cells.Item($row8, 29).Value2,
COR_Exp = $ws3.Cells.Item($row8, 30).Value2,
Seaman_Card_Exp = [string] $ws3.Cells.Item($row8, 31).Value2,
Passport_Exp = [string] $ws3.Cells.Item($row8, 32).Value2 WHERE PasportNumber = $ws3.Cells.Item($row8, 3).Value2"
}
}
可以使用Invoke-DbaQuery来更新表。使用参数化查询,而不是将Excel中的数据链接到单个语句中。也就是说,创建一个变量集合,并将其作为查询参数传递。参见文档示例5。这使得代码的读取更加简单,并保护您免受SQL注入的影响。像这样,
$query = 'UPDATE $Table7 SET STCW_Cert_Held = @STCW_Cert_Held, ISPS = @ISPS, ... where PasportNumber = @PasportNumber'
for ($row8 = 9; $row8 -lt 40; $row8++) {
if ([string]::IsNullOrEmpty($ws3.Cells.Item($row8, 3).Value2)){break} else {
# Build the parameter set
$params = @{
STCW_Cert_Held = $ws3.Cells.Item($row8, 18).Value2 # Description
ISPS = $ws3.Cells.Item($row8, 19).Value2
# ... omitted lots of parameters
PasportNumber = $ws3.Cells.Item($row8, 3).Value2 # Other notes
}
Invoke-DbaQuery -SqlInstance . -Query $query -SqlParameters $params
}
}
当你在做的时候,请更改变量名,避免使用幻数。到目前为止,有$row8
——这意味着什么?你从第8排开始读,对吧?当Excel源更改时(它们总是这样(,$row8
没有任何意义。另外,你从哪里得到40
的上限?您应该有一个名称清晰的常量。像这样,
# Skip 7 rows of headers
$startRow = 8
# Explain why there will not be more than 40 rows
$lastRow = 40
# Even better, use a function that finds out how
$lastRow = Get-LastRow($myExcelFile) much to import.
for ($row = $startRow; $ro8 -lt $lastRow; $row++) {
...
}