Contourner la limite d’insertion en MS SQL
Il m’arrive de devoir faire des INSERT massifs en MS SQL et d’être confronter à la limite du maximum d’INSERT possible d’un coup (1000 dans mon cas).
Du coup il faut bidouiller un peu pour faire rentrer mes dizaines de milliers d’INSERT. C’est là qu’intervient le modulo !
Voici ma méthode, mes données sont dans $Output:
$SQLQueryInsert = [System.Text.StringBuilder]::new()
# Suppression de la table si elle existe déjà
$SQLQueryInsert.AppendLine("if exists ( select * from sys.objects where object_id = object_id(N'[dbo].[MyTable]') and type in (N'U') )")
$SQLQueryInsert.AppendLine("drop table MyTable;")
$SQLQueryInsert.AppendLine("GO")
# Création du premier INSERT
$SQLQueryInsert.AppendLine("INSERT INTO [dbo].[MyTable](ID_RESSOURCE, ID_DOMAIN)") | Out-Null
$SQLQueryInsert.AppendLine("VALUES") | Out-Null
$i = 0
# Boucle For sur mes données contenues dans $Output
for($i; $i -lt $Output.Count; $i++) {
# Si c'est la dernière ligne, dans ce cas on termine par un ;
if($i -eq ($Output.Count - 1 )) {
$SQLQueryInsert.AppendLine("('" + $Output[$i].ID_RESSOURCE + "', '" + $Output[$i].ConvertedDomain + "', '" + $Output[$i].ADDomain + "');") | Out-Null
}
# Le modulo pour creer un nouvel INSERT pour contourner la limite, sauf si on arrive à la fin des inserts
elseif ($i % 999 -eq 0 -and $i -lt ($Output.Count - 2)) {
$SQLQueryInsert.AppendLine("('" + $Output[$i].ID_RESSOURCE + "', '" + $Output[$i].ConvertedDomain + "', '" + $Output[$i].ADDomain + "');") | Out-Null
$SQLQueryInsert.AppendLine("INSERT INTO [dbo].[MyTable](ID_RESSOURCE, ID_DOMAIN)") | Out-Null
$SQLQueryInsert.AppendLine("VALUES") | Out-Null
}
# Toutes les autres lignes
else {
$SQLQueryInsert.AppendLine("('" + $Output[$i].ID_RESSOURCE + "', '" + $Output[$i].ConvertedDomain + "', '" + $Output[$i].ADDomain + "'),") | Out-Null
}
}
# On convertit la query en String
$SQLQueryInsert.ToString()
Il suffit ensuite d’exécuter la query
0 commentaire