PRB: Σχεδιασμός εκτέλεσης και τα αποτελέσματα των ερωτημάτων συνένωσης συγκεντρωτικών αποτελεσμάτων εξαρτώνται θέσης έκφρασης

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

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

Συμπτώματα

Ενδέχεται να αντιμετωπίσετε μη αναμενόμενα αποτελέσματα, όταν εφαρμόζετε οποιαδήποτε τελεστές ή παραστάσεις στον όρο ORDER BY ερωτήματα συνένωσης συγκεντρωτικών αποτελεσμάτων. Τα αποτελέσματα των ερωτημάτων συνένωσης συγκεντρωτικών αποτελεσμάτων στο Microsoft SQL Server εξαρτώνται ή όχι εκφράσεις Transact-SQL εφαρμόζονται στις στήλες στον όρο ORDER BY του ερωτήματος. Για περισσότερες πληροφορίες ή για να δείτε ένα παράδειγμα ερωτήματος συνένωσης συγκεντρωτικών αποτελεσμάτων και η συμπεριφορά παρουσιάζεται, ανατρέξτε στην ενότητα "Περισσότερες πληροφορίες" αυτού του άρθρου.

Αιτία

Η σωστή συμπεριφορά για ένα ερώτημα συνένωσης συγκεντρωτικών αποτελεσμάτων δεν έχει οριστεί.

Μια εξέταση των αποτελεσμάτων του ερωτήματος SHOWPLAN αποκαλύπτει ότι ο επεξεργαστής ερωτήματος SQL Server δημιουργεί ένα σχέδιο διαφορετικό εκτέλεσης όταν παραστάσεις εφαρμόζονται σε στήλες στο ερώτημα όρο ORDER BY, από όταν εφαρμόζονται οι ίδιες εκφράσεις σε στήλες στη λίστα SELECT στο ερώτημα. Η απόφαση που έγιναν από τον επεξεργαστή του ερωτήματος εξαρτάται από το κόστος των σχεδίων δυνατή εκτέλεση.

Η προδιαγραφή ANSI SQL-92 απαιτεί ότι ταιριάζει με οποιαδήποτε στήλη που αναφέρεται από έναν όρο ORDER BY στο σύνολο αποτελεσμάτων, που ορίζεται από τις στήλες που υπάρχουν στη λίστα SELECT. Όταν εφαρμόζεται μια έκφραση σε ένα μέλος από έναν όρο ORDER BY, αυτή η στήλη που θα προκύψει δεν εκτίθεται στη λίστα SELECT, με αποτέλεσμα η συμπεριφορά δεν έχει οριστεί.

Επιπλέον, οι προδιαγραφές ANSI σχετικά με το πώς έχει έναν όρο ORDER BY θα εφαρμοστούν δηλώνουν ότι ως αποτέλεσμα το ORDER BY πρέπει να είναι το ίδιο όπως αν χρειαστούν σύνολο ολόκληρη αποτελεσμάτων που παράγονται από τη λίστα SELECT και στη συνέχεια να εκτελέσετε την ταξινόμηση του πίνακα που βασίζονται σε αυτές τις στήλες στη λίστα SELECT.

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιτύχετε τα αναμενόμενα αποτελέσματα από ένα ερώτημα συγκεντρωτικών αποτελεσμάτων συνένωσης, εφαρμόστε οποιαδήποτε συνάρτηση Transact-SQL ή μια παράσταση στις στήλες στη λίστα SELECT και όχι στον όρο ORDER BY.

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

Ένα ερώτημα συνένωσης συγκεντρωτικών αποτελεσμάτων είναι ένα ερώτημα που συνδυάζει τις τιμές πολλών γραμμών σε μία γραμμή.

Βήματα για την αναπαραγωγή της συμπεριφοράς

Χρησιμοποιήστε την ακόλουθη δέσμη ενεργειών Transact-SQL για την αναπαραγωγή της συμπεριφοράς.

Σημείωση η εφαρμογή των συναρτήσεων LTRIM και RTRIM στη στήλη [C1] στον όρο ORDER BY, σε αντίθεση με τη λίστα SELECT.
IF EXISTS( SELECT * FROM sysobjects WHERE name = 'T1' )
	DROP TABLE T1
GO

CREATE TABLE T1(  C1  NCHAR(1)  )

SET NOCOUNT ON

INSERT T1 VALUES( 'A' )
INSERT T1 VALUES( 'B' )

DECLARE @Str0 VARCHAR(4) 
DECLARE @Str1 VARCHAR(4) 
DECLARE @Str2 VARCHAR(4) 

SET @Str0 = ''
SET @Str1 = ''
SET @Str2 = ''

SELECT @Str0 = @Str0 + C1 FROM T1 ORDER BY C1
SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )
SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1

SELECT @Str0 'No functions applied to column.'
SELECT @Str1 'LTRIM() and RTRIM() applied to ORDER BY clause.'
SELECT @Str2 'SELECT list with LTRIM(RTRIM()) (Workaround)'

IF @Str1 <> @Str2
BEGIN
   PRINT ''
   PRINT 'Execution plan depends on where the functions are applied:'
   PRINT '=========================================================='
   PRINT ''

   SET @Str1 = ''
   SET @Str2 = ''

   SET STATISTICS PROFILE ON
   SELECT @Str1 = @Str1 + C1 FROM T1 ORDER BY LTRIM( RTRIM( C1 ) )
   SELECT @Str2 = @Str2 + LTRIM( RTRIM( C1 ) ) FROM T1 ORDER BY C1
   SET STATISTICS PROFILE OFF
END

SET NOCOUNT OFF

DROP TABLE T1
				

Ιδιότητες

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

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

 

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