2010-01-13 2 views
0

J'insère des lignes dans une table à partir d'autres tables de SQL Server Management Studio et certains enregistrements ne respectent pas une contrainte unique car les données initiales sont 'sales' et incohérentes.Détecter quelle ligne de l'ensemble de données enfreint la contrainte DB unique lors de l'insertion

Comment puis-je trouver quels enregistrements violent?

+0

En passant, Oracle a deux façons d'aider. Vous pouvez l'insérer dans une table d'erreurs pour le traitement ou vous pouvez utiliser MERGE pour INSÉRER uniquement les lignes non appariées. –

Répondre

0

Malheureusement, votre seule solution est de valider la contrainte avec une requête sur les données source pour trouver les coupables. Si vous utilisiez quelque chose comme SSIS, vous pouvez le configurer pour ignorer les lignes qui violent la ou les contraintes.

+1

triste, vraiment. le rdbms sait qui a échoué. Ça ne te dit rien. –

0

travail ce que la clé est, et essayer certains des éléments suivants:

1) Les données existent déjà:

select sourcekeyfield de sourcetable où existe (select * from desttable où destkeyfield = sourcekeyfield)

2) duplicatas de source:

select sourcekeyfield, count () du groupe sourcetable par comptage de sourcekeyfield ayant ()> 1

0

Vérifiez ce lien:

DataSet hell - "Failed to enable constraints. One or more rows contain values...."

Sanjay Sheth États RENDRE:

La solution réside dans la méthode GetErrors de la classe DataTable: http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataDataTableClassGetErrorsTopic.asp

Essentiellement, quand je vois le message ci-dessus, je vérifie les HasErrors 0 Propriétépour chaque DataTable de l'ensemble de données, puis appelez la méthode GetErrors sur les tables signalant des erreurs. GetErrors renvoie une collection de DataRows et vous pouvez appeler la propriété .RowError sur chacune des lignes affectées par une erreur pour savoir exactement quel est le problème .

et ajoute:

... désactiver les .EnableConstraints avant le remplissage. Normalement, j'autorise les contraintes, seulement après que le Fill d'origine soit terminé. Ensuite, vous pouvez attraper l'exception ci-dessus et lancer une fonction de détection d'erreur qui fait ce que j'ai décrit ci-dessus.

Questions connexes