2010-06-19 2 views
1

Nous insérons quelques millions d'enregistrements dans une table de détails dont les données sont stockées dans la table principale au format CSV. Pour faire l'insertion, nous utilisons une fonction d'application croisée, qui semble fonctionner si je fais les insertions une par une, mais si je fais l'insertion entière, seulement environ 2/3 des enregistrements entrent, et la requête s'arrête juste , avec succès après environ 3 heures et demie.Est-ce qu'un Cross Appliquer caution, mais pas d'erreur dans SQL Server?

est ici la requête d'insertion

INSERT INTO DetailsTable(MasterTableID, DetailColumn1, DetailColumn2) 
    SELECT MasterTableID, DetailColumn1, DetailColumn2 FROM MasterTable 
    CROSS APPLY [fn_CreateDetailData](MasterTableID, '§') 

Si je fais ce qui suit pour l'un des enregistrements qui ne soit pas inséré, everthing fonctionne très bien et il y a enregistrement est inséré très bien

INSERT INTO DetailsTable(MasterTableID, DetailColumn1, DetailColumn2) 
    SELECT MasterTableID, DetailColumn1, DetailColumn2 FROM MasterTable 
    CROSS APPLY [fn_CreateDetailData](MasterTableID, '§') 
    WHERE MasterTableID = 12345 

De tout ce que j'ai pu savoir sur SQL Server, une seule instruction insert existe dans une transaction, donc tout ou rien, mais cela ne semble pas être le cas ici.

+2

La seule raison à cela est que votre fonction filtre les autres lignes. Montrez-nous votre fonction. –

+0

Comment ma fonction peut-elle filtrer les lignes quand je ne spécifie pas l'ID de clé primaire, mais ne pas le filtrer quand je le fais? Malheureusement, cela semble être un problème trop spécifique pour que StackOverflow puisse le gérer. –

+0

Voici la chose, si je lance la fonction plus de fois, je reçois de plus en plus de nouvelles lignes uniques qui sont insérées, c'est ce qui me semble si étrange. –

Répondre

2

Est-ce exactement votre code, pour le SELECT? Avez-vous omis des détails comme, disons, l'utilisation des indices NOLOCK? NOLOCK est connu pour causer des lacunes mystérieuses dans les données, voir Previously committed rows might be missed if NOLOCK hint is used

+0

Eh bien, ce n'est pas exactement mon code, car nous n'avons pas vraiment une table appelée MasterTable. Mais à part renommer les colonnes et la table, c'est exactement ce que je cours. –

Questions connexes