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

Catégories : AstucesTutos

0 commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *