2010-12-06 12 views
1

Existe-t-il un mécanisme similaire à Oracle PL/SQL SAVE EXCEPTIONS dans Microsoft T-SQL? Actuellement, je fais la mise à jour en utilisant un curseur et c'est extrêmement lent.Mécanisme dans T-SQL similaire à SAVE EXCEPTIONS dans Oracle

La description de SAVE EXCEPTIONS à partir du site d'Oracle:

EXCEPTIONS SAUVER permet une instruction UPDATE, INSERT ou de suppression de continuer l'exécution après émet une exception . Lorsque l'instruction se termine, une erreur est émise pour signaler qu'au moins une exception s'est produite. Les exceptions sont collectées dans un tableau que vous pouvez examiner à l'aide de % BULK_EXCEPTIONS après l'exécution de l'instruction .

lien vers la définition Enregistrer des exceptions: http://download.oracle.com/docs/cd/E11882_01/timesten.112/e13076/sqlexamples.htm#TTPLS364

+1

Si vous parlez des bases de données relationnelles, où le maintien de l'intégrité référentielle est important, je ne vois pas comment c'est une fonctionnalité souhaitable. – StingyJack

+0

+1 @StingyJack - Sort de l'atomicité jette par la fenêtre ... – JNK

+0

@StingyJack - Je suppose que ceci est lié à une vérification de contrainte différée et tant que ** ce qui est validé ** est valide par rapport aux contraintes, il n'y a pas de problème. Si tel est le cas, cela n'est pas possible dans SQL Server. La meilleure solution serait probablement de réécrire votre code basé sur le curseur d'une manière basée sur un ensemble. –

Répondre

2

Si vous importez un grand nombre d'enregistrements, utilisez un package SSIS et envoyez les lignes ayant échoué à une table d'exceptions. Si vous pouvez; t utilise SSIS pour une raison quelconque, pensez à nettoyer vos données avant d'essayer de les insérer, de sorte que vous n'ayez pas de lignes ayant échoué. Par exemple supprimer tous les enregistrements qui ont une valeur nulle où vous devez avoir une valeur, null des dates incorrectes, etc.

Si vous venez d'Oracle, vous devez arrêter d'utiliser des curseurs et utiliser la logique set-based à la place. SQL Server ne fonctionne pas correctement avec les curseurs.

+0

Merci HLGEM. Edit (appuyez sur Entrée trop rapide): Je ne pensais même pas à SSIS car je mettais à jour les enregistrements et je ne savais pas que je pouvais mettre à jour les enregistrements en l'utilisant. –

1

Je pense que le plus proche, vous pouvez venir à simuler ce comportement serait de désactiver/activer (avec contrôle) les contraintes. L'inconvénient de cette approche est que les mauvaises données sont maintenant dans votre table et vous ne pouvez pas activer les contraintes tant qu'elles ne sont pas nettoyées. Vous devez décider si c'est un risque acceptable dans votre cas particulier.

ALTER TABLE YourTable NOCHECK CONSTRAINT ALL 

/* Perform your DML operations */ 

ALTER TABLE YourTable WITH CHECK CHECK CONSTRAINT ALL 

/* Deal with any errors that are thrown: 
    'The ALTER TABLE statement conflicted with the CHECK constraint ...' 
    clean up the bad data then enable constraints again */ 
+0

Merci pour votre réponse. Je vous remercie y compris l'inconvénient, car ce ne serait certainement pas un risque acceptable! Merci encore! –

1

Vous ne savez pas exactement quel type d'exceptions vous attendez. Certains détails supplémentaires le long de cette ligne pourraient être utiles.

Je ne crois pas qu'il y ait quelque chose d'équivalent dans MS SQL à ce que vous décrivez. Quelques idées pour faire quelque chose un peu similaire:

  • Vous pouvez utiliser un TRY ... CATCH dans SQL, mais qui va échouer tout le lot si quelque chose va mal, et pas seulement les lignes problématiques.
  • Une tâche d'insertion en bloc SSIS peut être configurée pour avoir un chemin séparé pour les lignes "en échec" que vous pouvez ensuite traiter comme vous le souhaitez. Si vous parlez de index unique duplique (insérer toutes ces lignes, et s'il y en a qui sont simplement ignorées, mais n'échoue pas tout le lot), vous pouvez déclarer l'index unique avec l'option IGNORE_DUP_KEY (this SO question)

Quoi de plus, vous auriez probablement besoin d'être plus explicite sur les types d'erreurs que vous imaginez rencontrer.

+0

Merci Brad. Je suis d'accord pour aller sur la route SSIS que vous et HLGEM suggéré. J'apprécie les suggestions et l'aide! –