将多行从 CSV 导入到 SQL Server 并为每行创建一个新 ID

问题描述 投票:0回答:1

我正在尝试从

.CSV
文件中提取多个“代理”行并将它们发送到 SQL Server,但是
.CSV
文件
Num Contrat.csv
对于多个代理来说可能是相同的,而它在 SQL Server 中必须是唯一的.

示例:我的档案中有一个代理:

enter image description here

字段为Matricule / Name / DateDebut(开始日期)/ DateFin(结束日期)/ ETP / Num Contrat

最后一个字段是最重要的,因为它是最有问题的。它在

.CSV
中是相同的,但在 SQL Server 中必须是唯一的。

这是我想在代码中使用的逻辑:

enter image description here

这是我尝试在脚本中获得此结果的方法:

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)错误,所以我的递增不起作用。

我已经尝试了几种方法,但我不知道如何解决我的问题(如果它有效的话)。

我希望一切都清楚,谢谢您的帮助。

sql-server powershell csv
1个回答
0
投票

需要明确的是:您想要替换“合同编号”字段中的最后两个字符吗?此时,只需在导入时添加渐进即可。

$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}
替换为您想要的位数 如果您想在某个数字后重置,则需要或添加更多逻辑(我猜,这取决于您可以预期有多少相同编号的合同)

© www.soinside.com 2019 - 2024. All rights reserved.