Ποιος είναι ο καλύτερος τρόπος για να λάβετε το IDENTITY
της εισαγόμενης γραμμής;
Γνωρίζω για τα @@IDENTITY
και IDENT_CURRENT
και SCOPE_IDENTITY
αλλά δεν καταλαβαίνω τα πλεονεκτήματα και τα μειονεκτήματα που συνδέονται με το καθένα.
Μπορεί κάποιος να μου εξηγήσει τις διαφορές και πότε πρέπει να χρησιμοποιώ το καθένα από αυτά;
@@IDENTITY
επιστρέφει την τελευταία τιμή ταυτότητας που δημιουργήθηκε για οποιονδήποτε πίνακα στην τρέχουσα περίοδο λειτουργίας, σε όλα τα πεδία εφαρμογής. Θα πρέπει να είστε προσεκτικοί εδώ, αφού είναι σε όλα τα πεδία εφαρμογής. Θα μπορούσατε να λάβετε μια τιμή από ένα σκανδάλη, αντί για την τρέχουσα δήλωσή σας.
SCOPE_IDENTITY()
επιστρέφει την τελευταία τιμή ταυτότητας που δημιουργήθηκε για οποιονδήποτε πίνακα στην τρέχουσα συνεδρία και στο τρέχον πεδίο εφαρμογής. Γενικά αυτό που θέλετε να χρησιμοποιήσετε.
IDENT_CURRENT('tableName')
επιστρέφει την τελευταία τιμή ταυτότητας που δημιουργήθηκε για έναν συγκεκριμένο πίνακα σε οποιαδήποτε συνεδρία και σε οποιαδήποτε εμβέλεια. Αυτό σας επιτρέπει να καθορίσετε από ποιον πίνακα θέλετε την τιμή, σε περίπτωση που οι δύο παραπάνω δεν είναι ακριβώς αυτό που χρειάζεστε (πολύ σπάνια). Επίσης, όπως ανέφερε ο @Guy Starbuck, "Θα μπορούσατε να το χρησιμοποιήσετε αυτό αν θέλετε να λάβετε την τρέχουσα τιμή IDENTITY για έναν πίνακα στον οποίο δεν έχετε εισάγει εγγραφή.",
Η ρήτρα OUTPUT
της δήλωσης INSERT
θα σας επιτρέψει να αποκτήσετε πρόσβαση σε κάθε γραμμή που εισήχθη μέσω αυτής της δήλωσης. Δεδομένου ότι είναι περιορισμένη στη συγκεκριμένη δήλωση, είναι πιο απλή από τις άλλες παραπάνω συναρτήσεις. Ωστόσο, είναι λίγο πιο μακροσκελής (θα πρέπει να εισαγάγετε σε μια μεταβλητή πίνακα/πίνακα temp και στη συνέχεια να κάνετε αναζήτηση σε αυτόν) και δίνει αποτελέσματα ακόμη και σε ένα σενάριο σφάλματος όπου η δήλωση ανατρέπεται. Τούτου λεχθέντος, εάν το ερώτημά σας χρησιμοποιεί ένα σχέδιο παράλληλης εκτέλεσης, αυτή είναι η μόνη εγγυημένη μέθοδος για να λάβετε την ταυτότητα (εκτός από την απενεργοποίηση του παραλληλισμού). Ωστόσο, εκτελείται πριν από τα triggers και δεν μπορεί να χρησιμοποιηθεί για την επιστροφή τιμών που δημιουργούνται από τα triggers.
Οι @@IDENTITY, SCOPE_IDENTITY και IDENT_CURRENT είναι παρόμοιες συναρτήσεις στο ότι επιστρέφουν την τελευταία τιμή που εισήχθη στη στήλη IDENTITY ενός πίνακα.
Οι @@IDENTITY και SCOPE_IDENTITY θα επιστρέψουν την τελευταία τιμή ταυτότητας που δημιουργήθηκε σε οποιονδήποτε πίνακα στην τρέχουσα περίοδο λειτουργίας. Ωστόσο, η SCOPE_IDENTITY επιστρέφει την τιμή μόνο εντός της τρέχουσας εμβέλειας- η @@IDENTITY δεν περιορίζεται σε συγκεκριμένη εμβέλεια.
Η IDENT_CURRENT δεν περιορίζεται από την εμβέλεια και τη συνεδρία- περιορίζεται σε έναν καθορισμένο πίνακα. Το IDENT_CURRENT επιστρέφει την τιμή ταυτότητας που δημιουργήθηκε για έναν συγκεκριμένο πίνακα σε οποιαδήποτε συνεδρία και σε οποιαδήποτε εμβέλεια. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα IDENT_CURRENT.
@@IDENTITY είναι η τελευταία ταυτότητα που εισήχθη με την τρέχουσα σύνδεση SQL. Αυτή είναι μια καλή τιμή για να επιστρέψετε από μια αποθηκευμένη διαδικασία εισαγωγής, όπου χρειάζεστε μόνο την ταυτότητα που έχει εισαχθεί για τη νέα εγγραφή σας και δεν σας ενδιαφέρει αν προστέθηκαν περισσότερες γραμμές στη συνέχεια.
SCOPE_IDENTITY είναι η τελευταία ταυτότητα που εισήχθη χρησιμοποιώντας την τρέχουσα σύνδεση SQL και στην τρέχουσα εμβέλεια - δηλαδή, εάν υπήρχε μια δεύτερη ταυτότητα που εισήχθη βάσει ενός σκανδάλου μετά την εισαγωγή σας, δεν θα αντικατοπτριζόταν στην SCOPE_IDENTITY, παρά μόνο στην εισαγωγή που πραγματοποιήσατε. Ειλικρινά, δεν είχα ποτέ λόγο να το χρησιμοποιήσω αυτό.
IDENT_CURRENT(tablename) είναι η τελευταία ταυτότητα που εισάγεται ανεξάρτητα από τη σύνδεση ή το πεδίο εφαρμογής. Θα μπορούσατε να το χρησιμοποιήσετε αν θέλετε να λάβετε την τρέχουσα τιμή IDENTITY για έναν πίνακα στον οποίο δεν έχετε εισάγει εγγραφή.