ΕΠΙΔΙΌΡΘΩΣΗ: Λανθασμένα αποτελέσματα εάν χρησιμοποιείτε παρενθέσεις γύρω από την ΕΠΙΛΟΓΉ σε μια πρόταση που περιέχει μια έκφραση κοινό πίνακα στον SQL Server 2008


Συμπτώματα


Σε έναν υπολογιστή που εκτελεί τον Microsoft SQL Server 2008, λάβετε υπόψη σας τα παρακάτω σενάρια.

Σενάριο 1

Μπορείτε να ορίσετε μια κοινή παράσταση πίνακα (CTE) χρησιμοποιώντας την πρόταση WITH. Για παράδειγμα, μπορείτε να εκτελέσετε το παρακάτω ερώτημα.
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, χρησιμοποιώντας την ακόλουθη δέσμη ενεργειών.
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 server αντιμετωπίζει διακομιστή μεγάλη κυκλοφορία.

Σενάριο 3

Μπορείτε να ορίσετε μια κοινή παράσταση πίνακα χρησιμοποιώντας την πρόταση WITH. Στη δήλωση με, μπορείτε να καθορίσετε έναν πίνακα που δεν υπάρχει. Για παράδειγμα, μπορείτε να εκτελέσετε το παρακάτω ερώτημα.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Όταν εκτελείτε το ερώτημα, δεν θα λάβετε ένα σφάλμα για πίνακα λείπει.

Αιτία


Αυτά τα προβλήματα παρουσιάζονται εξαιτίας μεταποίηση μια πρόταση SELECT που ακολουθεί μία δήλωση με with δεν λειτουργεί σωστά. Η δήλωση με with χρησιμοποιεί την ακόλουθη σύνταξη.
WITH common_table_expression AS(CTE_query_definition)
Στη συνέχεια, η δήλωση αυτή δημιουργεί ένα σύνολο αποτελεσμάτων που έχει αντιστοιχιστεί το κοινό όνομα έκφραση πίνακα που καθορίστηκε. Στη συνέχεια, μπορείτε να ακολουθήσετε αυτή τη δήλωση με μια εντολή SELECT. Εάν αυτή η δεύτερη πρόταση περικλείεται σε παρενθέσεις, και στη συνέχεια προσπαθήσετε να εκτελέσετε μια λειτουργία σε τα αποτελέσματα ή προσπαθείτε να εκτελέσετε μια προβολή Διαχείριση δυναμικών sys.dm_exec_query_stats, λαμβάνετε λανθασμένα αποτελέσματα ή ένα σφάλμα.

Επίλυση


Πληροφορίες πακέτου υπηρεσιώνΓια να επιλύσετε αυτό το ζήτημα, αποκτήστε το πιο πρόσφατο service pack για τον SQL Server 2008. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:
968382 Τρόπος απόκτησης του τελευταίου service pack για τον SQL Server 2008

Λύση


Για να επιλύσετε αυτά τα ζητήματα, πρέπει να καταργήσετε τις παρενθέσεις από τη δήλωση που ακολουθεί την κοινή έκφραση πίνακα. Για παράδειγμα, σκεφτείτε τα εξής με δήλωση, η οποία χρησιμοποιεί τέτοια παρενθέσεις.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Για να επιλύσετε αυτά τα ζητήματα, αλλάξτε το εξής με δήλωση, η οποία δεν χρησιμοποιεί αυτές τις παρενθέσεις.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Κατάσταση


Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα των προϊόντων της Microsoft που παρατίθενται στην ενότητα "Ισχύει για". Αυτό το ζήτημα διορθώθηκε αρχικά στον SQL Server 2008 Service Pack 2 (SP2).

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


Για περισσότερες πληροφορίες σχετικά με τον τρόπο χρήσης της δήλωσης με με μια κοινή παράσταση πίνακα, επισκεφθείτε την ακόλουθη ιστοσελίδα MSDN:Για περισσότερες πληροφορίες σχετικά με sys.dm_exec_query_stats, επισκεφθείτε την ακόλουθη ιστοσελίδα MSDN: