我试图从一个.CSV
文件中提取几个“代理”行并将它们发送到 SQL Server,但该.CSV
文件Num Contrat.csv
对于几个代理来说可能是相同的,而在 SQL Server 中它必须是唯一的。
例如:我的档案里有一个代理:
字段包括 Matricule / 姓名 / DateDebut (开始日期) / DateFin (结束日期) / ETP / Num Contrat
最后一个字段是最重要的,因为它是最容易出问题的。它在中是相同的.CSV
,但在 SQL Server 中必须是唯一的。
这是我想要在代码中使用的逻辑:
以下是我在脚本中尝试获得此结果的方法:
try {
# Data
$matriculeContrat = $ligne.MATRICULE
$numContratOriginal = $ligne.'Num Contrat'
$abrTypContrat = $ligne.'Abr Typ Contrat'
$idEtablissement = [string]$ligne.'Num Dossier'
# Delete two characters and increment ContractNumber
$baseNumContrat = $numContratOriginal.Substring(0, [Math]::Max(0, $numContratOriginal.Length - 2))
$newNumContrat = $numContratOriginal
$suffix = 1
# Generate new contract number - Max 15 chars (doesn't work at all ?)
while ((Invoke-Sqlcmd -Query "SELECT COUNT(1) FROM Contrats WHERE [Num Contrat] = N'$newNumContrat' AND Matricule = N'$matriculeContrat'" -ServerInstance $serverInstance -Database $database)[0].Column1 -gt 0)
{
$newNumContrat = $baseNumContrat + ($suffix.ToString("D2"))
if ($newNumContrat.Length > 15)
{
$newNumContrat = $newNumContrat.Substring(0, 15)
}
$suffix++
}
$insertContratQuery = @"INSERT INTO Contrats ([Num Contrat], Avenant, [Date début], [Date Fin], Type, [Temps Base], IDRégime, [Régime Mod], [Base contractuelle], RTT, [travail de nuit], [Règle équivalence], MultiEtablissement, [Matricule agent remplace], [Motif remplacement], [Convention collective], [Num contrat base], IDEtablissement, Matricule, [Report CPA], [Report Ancienneté], [Report CESS], Commentaire)
VALUES (N'$newNumContrat', N'CONTRAT', $debutContratSql, $finContratSql, N'$abrTypContrat', $etp, N'MOD', NULL, $baseContractuelle, 0, $travailNuit, 0, 0, NULL, NULL, N'CCNT 66', N'$numContratOriginal', N'$idEtablissement', N'$matriculeContrat', N'0.00', 0, 0, NULL)"
@Invoke-Sqlcmd -Query $insertContratQuery -ServerInstance $serverInstance -Database $database
Write-Host "Contrat ajouté pour le matricule : $matriculeContrat avec Num Contrat : $newNumContrat"
}
catch
{
$errorMessage = "Erreur lors de l'ajout du contrat pour le matricule $matriculeContrat : $($_.Exception.Message)"
Write-Host "Requête SQL problématique pour le matricule $matriculeContrat : $insertContratQuery"
Add-Content -Path $sqlDebugFilePath -Value "Requête SQL pour le matricule $matriculeContrat : $insertContratQuery`nErreur : $errorMessage`n"
}
对于第一份合同来说,插入很顺利(所以我有每个代理人的 1 份副本,其中有他们“唯一”的原始合同编号,没有任何后缀,但是在 Powershell 中我多次收到此错误:
Invoke-Sqlcmd : Violation de la contrainte PRIMARY KEY
«PK_Contrats». Impossible d'insérer une clé en double dans
l'objet «dbo.Contrats». Valeur de clé dupliquée: (73065110180903).
L'instruction a été arrêtée.
Au caractère C:\Interconsult\Script_GetMS_Update.ps1:192 : 5
+ Invoke-Sqlcmd -Query $insertContratQuery -ServerInstance
$serverI ...
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : (:) [Invoke-Sqlcmd],
SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId :
SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
只是一个重复的主键(Num Contract)错误,所以我的递增不起作用。
我尝试了几种方法,但我不知道该如何解决我的问题,或者是否有效。
我希望一切都清楚,感谢您的帮助。