我正在尝试从
.CSV
文件中提取多个“代理”行并将它们发送到 SQL Server,但是 .CSV
文件 Num Contrat.csv
对于多个代理来说可能是相同的,而它在 SQL Server 中必须是唯一的.
示例:我的档案中有一个代理:
字段为Matricule / Name / 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"
}
第一份合同的插入效果很好(所以我有每个代理的一份副本,其“唯一”原始合同号没有任何后缀,但是在 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)错误,所以我的递增不起作用。
我已经尝试了几种方法,但我不知道如何解决我的问题(如果它有效的话)。
我希望一切都清楚,谢谢您的帮助。
需要明确的是:您想要替换“合同编号”字段中的最后两个字符吗?此时,只需在导入时添加渐进即可。
$Counter = 0
$UniqueContractArray = $CsvPath | Import-Csv |
Select-Object -Property 'matricule', 'Name', 'DateDebut', 'DateFin', 'ETP',
@{
Name = 'Num Contract'
Expression = { '{0}{1:d4}' -f $_.'Num Contract', $script:counter++ }
}
通过这种方式,您可以保留原始合同编号(可能有用),同时还知道最后 N 数字用于区分相同编号的合同。
将
4
中的 {1:d4}
替换为您想要的位数
如果您想在某个数字后重置,则需要或添加更多逻辑(我猜,这取决于您可以预期有多少相同编号的合同)