ΕΝΗΜΕΡΩΣΗ: εσφαλμένα αποτελέσματα, αν χρησιμοποιήσετε παρενθέσεις SELECT σε μια πρόταση που περιέχει μια έκφραση κοινό πίνακα στον SQL Server 2008

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:2322209
Συμπτώματα
Σε έναν υπολογιστή που εκτελεί τον Microsoft SQL Server 2008, λάβετε υπόψη σας τα παρακάτω σενάρια.

Σενάριο 1

Μπορείτε να ορίσετε μια κοινή παράσταση πίνακα (CTE) χρησιμοποιώντας την εντολή με το . Για παράδειγμα, εκτελείτε το παρακάτω ερώτημα.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Στη συνέχεια, εκτελείτε το ερώτημα.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
Σε αυτό το σενάριο, το σχέδιο προσωρινά αποθηκευμένο ερώτημα για το ερώτημα αυτό αποθηκεύει εσφαλμένες τιμές statement_start_offset και statement_end_offset. Συγκεκριμένα, παρατηρήστε την τιμή statement_end_offset είναι μικρότερη από την τιμή statement_start_offset κατά την εκτέλεση της προβολής Διαχείριση δυναμικών sys.dm_exec_query_stats (DMV).

Εξαιτίας αυτού του ζητήματος, μια αναφορά επιδόσεων ενδέχεται να αποτύχει κατά την εκτύπωση προϋποθέτει ότι η τιμή statement_start_offset είναι πάντα μικρότερος από την τιμή statement_stop_offset.

Σενάριο 2

Καθορίζετε μια συνηθισμένη έκφραση πίνακα χρησιμοποιώντας την πρόταση με, και μπορείτε να χρησιμοποιήσετε την επιλογή ΜΕΤΑΓΛΩΤΤΊΣΤΕ. Για παράδειγμα, δημιουργήστε μια συνάρτηση στον SQL Server 2008, χρησιμοποιώντας την ακόλουθη script.
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
Κατά την εκτέλεση ενός ερωτήματος “ επιλέξτε dbo.function1() ”, λαμβάνετε το ακόλουθο μήνυμα λάθους:
Παρουσιάστηκε ένα σοβαρό σφάλμα στην τρέχουσα εντολή. Τα αποτελέσματα, εάν υπάρχουν, θα πρέπει να απορριφθούν.

Επιπλέον, αυτό το σφάλμα μπορεί να προκύψει χωρίς την επιλογή ΜΕΤΑΓΛΩΤΤΊΣΤΕ εάν ο διακομιστής SQL αντιμετωπίζει διακομιστή μεγάλη κυκλοφορία.

Σενάριο 3

Μπορείτε να ορίσετε μια κοινή παράσταση πίνακα χρησιμοποιώντας την πρόταση με το . Στη δήλωση με, μπορείτε να καθορίσετε έναν πίνακα που δεν υπάρχει. Για παράδειγμα, εκτελείτε το παρακάτω ερώτημα.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Όταν εκτελείτε το ερώτημα, δεν λαμβάνετε σφάλμα για πίνακα λείπει.
Αιτία
Αυτά τα προβλήματα παρουσιάζονται εξαιτίας ενός παρουσιάζει δυσλειτουργία επεξεργασίας μιας πρότασης SELECT που ακολουθεί μια πρόταση με. Χρησιμοποιεί την πρόταση με την ακόλουθη σύνταξη.
WITH common_table_expression AS(CTE_query_definition)
Αυτήν τη δήλωση, στη συνέχεια, δημιουργεί ένα σύνολο αποτελεσμάτων που έχει αντιστοιχιστεί το κοινό όνομα πίνακα παράσταση που καθορίστηκε. Στη συνέχεια, μπορείτε να ακολουθήσετε αυτή τη δήλωση με μια εντολή SELECT. Εάν αυτή η δεύτερη πρόταση μέσα σε παρενθέσεις, και στη συνέχεια προσπαθήσετε να εκτελέσετε μια λειτουργία σε τα αποτελέσματα ή προσπαθήσετε να εκτελέσετε μια προβολή Διαχείριση δυναμικών sys.dm_exec_query_stats, λαμβάνετε λανθασμένα αποτελέσματα ή ένα σφάλμα.
Προτεινόμενη αντιμετώπιση
Αυτά τα προβλήματα έχουν επιλυθεί στον SQL Server 2008 Service Pack 2 CTP. Κάντε λήψη και εγκαταστήστε το πιο πρόσφατα στον SQL Server 2008 service pack.
968382Με τον τρόπο απόκτησης του τελευταίου service pack για τον SQL Server 2008
Μπορείτε να κάνετε λήψη του SQL Server 2008 Service Pack 2 CTP κατευθείαν από το Κέντρο λήψης της Microsoft:
Εναλλακτικός τρόπος αντιμετώπισης
Για να επιλύσετε αυτά τα ζητήματα, πρέπει να καταργήσετε τις παρενθέσεις από τη δήλωση που ακολουθεί την κοινή έκφραση πίνακα. Για παράδειγμα, σκεφτείτε τα εξής WITH δήλωση, η οποία χρησιμοποιεί τέτοια παρενθέσεις.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Για να επιλύσετε αυτά τα ζητήματα, αλλάξτε τα εξής WITH πρόταση που δεν χρησιμοποιεί αυτές τις παρενθέσεις.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
Κατάσταση
Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα θέμα που αφορά τα προϊόντα της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".
Περισσότερες πληροφορίες
Για περισσότερες πληροφορίες σχετικά με τον τρόπο χρήσης της δήλωσης με με μια συνηθισμένη έκφραση πίνακα, επισκεφθείτε την παρακάτω ιστοσελίδα MSDN:Για περισσότερες πληροφορίες σχετικά με την sys.dm_exec_query_stats, επισκεφθείτε την παρακάτω ιστοσελίδα MSDN:
ερώτημα κώδικα cte SQL

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί αυτόματα

Eigenschaften

Artikelnummer: 2322209 – Letzte Überarbeitung: 08/31/2010 20:35:00 – Revision: 1.0

Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup

  • kbqfe kbfix kbexpertiseadvanced kbsurveynew kbtshoot kbquery kbmt KB2322209 KbMtel
Feedback