使用 DBATOOLS 在 SQL 服务器中更新 table
Update table in SQL Server using DBATOOLS
我有这段代码可以用 excel sheet 中的值更新我的 table 中的几个列。我尝试使用 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"
}
}
更新 table 可以用 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++) {
...
}
我有这段代码可以用 excel sheet 中的值更新我的 table 中的几个列。我尝试使用 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"
}
}
更新 table 可以用 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++) {
...
}