Η συμπεριφορά της συνάρτησης IDENTITY όταν χρησιμοποιείται με SELECT INTO ή INSERT SELECT ερωτήματα που περιέχει έναν όρο ORDER BY

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 273586 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Όταν χρησιμοποιείτε ένα ερώτημα SELECT INTO με τοΤαυτότητα (Identity)συνάρτηση και έναν όρο ORDER BY, οι τιμές ταυτότητας που παράγονται δεν είναι βέβαιο ότι έχουν την ίδια σειρά με τη σειρά που παρέχεται από τον όρο ORDER BY. Για παράδειγμα, εάν ηΤαυτότητα (Identity)συνάρτηση ξεκινά με μια αρχική τιμή 1 και ένα βήμα 1, η πρώτη γραμμή στο σύνολο αποτελεσμάτων ταξινομημένη θα μπορούσε να έχει μια τιμή διαφορετική από το 1, η δεύτερη γραμμή μπορεί να έχει μια τιμή διαφορετική από 2 και έτσι forth.While η παραγγελία ενδέχεται να εμφανίζονται όπως αναμενόταν, η συμπεριφορά δεν είναι εγγυημένη. Η ύπαρξη TOP ή SET ROWCOUNT επίσης δεν εγγυάται την σειρά των γραμμών.

Εάν θέλετε τοΤαυτότητα (Identity)τιμές που θα αντιστοιχιστεί σε ένα συνεχόμενο τρόπο που ακολουθεί την παραγγελία στον όρο ORDER BY, δημιουργήστε έναν πίνακα που περιέχει μια στήλη με τοΤαυτότητα (Identity)η ιδιότητα και στη συνέχεια εκτελέστε μια εισαγωγή SELECT … ORDER BY ερώτημα για τη συμπλήρωση αυτού του πίνακα.

Περισσότερες πληροφορίες

Οι τιμές ταυτότητας που παράγονται εξαρτάται από τη θέση του στοGetIdentity()η λειτουργία του δέντρου ερωτήματος (showplan), που μπορεί να αλλάξει οφείλεται σε αλλαγές βελτιστοποιητή, σχέδια παράλληλη ερώτημα ή την ύπαρξη ROWCOUNT TOP/SET. Ενώ τα σενάρια στα οποία μπορεί να δείτε ένα SELECT INTO με έναΤαυτότητα (Identity)συνάρτηση και έναν όρο ORDER BY παράγουν τιμές με τη σειρά που θέλετε αυτή η συμπεριφορά δεν είναι εγγυημένη και μπορεί να αλλάξουν χωρίς προειδοποίηση.Τα παρακάτω σενάρια αφορούν μια δήλωση SELECT INTO και έναΤαυτότητα (Identity)Function.

Σκεφτείτε έναν πίνακα που ονομάζεταιOldTableμε τις ακόλουθες τιμές.
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

Σενάριο 1

Σε αυτό το σενάριο, το ερώτημα SELECT INTO χρησιμοποιεί μια συνάρτηση IDENTITY και έναν όρο ORDER BY.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
Νέου_πίνακαμπορεί να εισαχθεί με γραμμές σε έναν από τους παρακάτω δύο τρόπους.

Μέθοδος 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
Ενδέχεται να παρατηρήσετε ότι η τιμή IDENTITY που δημιουργεί το SQL Server δεν είναι με τη σειρά της στήλης (ORDER BYΣτ1) στο ερώτημα.

Μέθοδος 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
Σε αυτήν την περίπτωση, ενδέχεται να παρατηρήσετε ότι το IDENTITY τιμή που ο SQL Server δημιουργεί έχει ακριβώς την ίδια σειρά όπως τη στήλη (ORDER BYΣτ1) στο ερώτημα. Ωστόσο, αυτό είναι συμπτωματικές και δεν είναι η εγγυημένη σειρά θα εμφανίζεται κάθε φορά που εκτελείται το ερώτημα.

Σενάριο 2

Τα ακόλουθα ερωτήματα SELECT INTO, χρησιμοποιήστε τη συνάρτηση IDENTITY και έναν όρο ORDER BY, με έναν τελεστή TOP ή μια πρόταση SET ROWCOUNT.
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
-ή-
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
NewTablemay be inserted with rows in one of the following three possible ways:

Μέθοδος 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
In this case, you may see that the IDENTITY value that SQL Server generates is not in the same order as the ORDER BY column (Col1) in the query.

Μέθοδος 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
In this case, you may notice that the IDENTITY value that SQL Server generates is exactly in the same order as the ORDER BY column (Col1) in the query. However, this is coincidental and is not the guaranteed order you will receive every time the query is run.

Η μέθοδος 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
In this case, the IDENTITY value that SQL Server generates is not in the same order as the ORDER BY column (Col1) in the query. Additionally, the data inserted does not meet the SEED and INCREMENT requirements specified in the IDENTITY function in the query (SEED=1, INCREMENT=1).

Actually, theIDENTITYfunction generates identity values correctly based on the SEED and INCREMENT parameters. However, the identity value generation occurs before the rows are sorted based on the ORDER BY clause. Therefore, when you use a TOP operator or a SET ROWCOUNT statement, the rows inserted in the resultant table (NewTable) seem to have incorrect identity values. The identity values SQL Server generates might not match the SEED and INCREMENT parameters of theIDENTITYFunction.

Here is an example that involves an INSERT INTO SELECT FROM with ORDER BY clause.

Consider a table that is namedOldTablewith the following values:
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


Below is the target table namedNewTable(ID is an identity column)
ID (identity)    Col1     Col2
---------------    -------   ------


The following INSERT INTO SELECT FROM query with an ORDER BY clause will guarantee that column ID inNewTableis in the same order asCol1.
INSERT INTO NewTable (Col1, Col2) SELECT Col1, Col2 FROM OldTable ORDER BY Col1 
ID (identity)    Col1     Col2
-------------    ------   ------
1                1         S
2                2         z
3                7         G
4                11        F
5                17        I

ΣΗΜΕΙΩΣΗID identity column is generated to have same order as ofCol1. However, INSERT INTO doesn’t guarantee the physical order of either ID orCol1στοNewTable. To retrieve the data in desired order, an ORDER BY clause is required as shown by following SELECT statement:
SELECT * from NewTable ORDER BY ID

Ιδιότητες

Αναγν. άρθρου: 273586 - Τελευταία αναθεώρηση: Κυριακή, 19 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Standard Edition
Λέξεις-κλειδιά: 
kbhowto kbinfo kbpending kbmt KB273586 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:273586

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com