Je mets en place un système d’import de table à table sur une base de données SQL Server 2000 de 60 GO, plusieurs dizaines de millions de lignes à importer.

Le problème qui se pose lorsque je fais la requête en un bloc est une saturation du journal de transaction.
Une solution serait d’importer en plusieurs blocs plus petits (par bloc d’un million).
L’instruction BULK INSERT avec le paramètre BATCH SIZE ne fonctionne pas pour l’importation de table à table.
J’ai utilisé l’astuce avec ROWCOUNT en faisant bien attention de ne pas réinsérer deux fois la même ligne si elle a déjà été insérée, mais j’ai comme même des erreurs de violation de clé primaires, je ne comprends pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
SET ROWCOUNT 1000000 
            Encore: 
             BEGIN TRANSACTION      
                 Insert tabledestination(
                           Select * from tablesource
                            Where ID not in ( Select ID from tabledestination)
                           )
            END TRANSACTION             IF @@ROWCOUNT > 0 GOTO Encore:
             SET ROWCOUNT 0

J'ai trouvé cette technique en parcourant le forum, cependant le ROWCOUUNT est encapsulé dans la transaction ce qui ne semble pas fonctionner, il passe une seule fois dans la boucle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
declare @startId numeric
declare @rows int
 
SELECT @rows = 10000
while @rows > 0
begin
BEGIN TRANSACTION
SET rowcount 10000
    SELECT @startId = isnull(max(id), 0) FROM nouvelle_table
    INSERT nouvelle_table SELECT * FROM ancienne_table WHERE id > @startId
    SELECT @rows = @@rowcount
    dump transaction ma_db TO "/chemin....."
COMMIT TRANSACTION
SET rowcount 10000
end



Si vous avez une autre technique optimisée pour l’importation de gros volumes de données qui ne sature pas le journal de transaction (pas avec DTS mais avec des requête T-SQL) je suis preneur.