Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Συμπτώματα

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

Σενάριο 1

Μπορείτε να καθορίσετε μια κοινή παράσταση πίνακα (στε) χρησιμοποιώντας την πρόταση 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

Καθορίζετε μια κοινή παράσταση πίνακα χρησιμοποιώντας την πρόταση WITH και χρησιμοποιείτε την επιλογή ΜΕΤΑΓΛΩΤΤΊΣτε. Για παράδειγμα, μπορείτε να δημιουργήσετε μια συνάρτηση στον 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

Όταν εκτελείτε ένα ερώτημα "Select dbo. function1 ()", λαμβάνετε το ακόλουθο μήνυμα σφάλματος:

Παρουσιάστηκε σοβαρό σφάλμα στην τρέχουσα εντολή. Τα αποτελέσματα, εάν υπάρχουν, θα πρέπει να απορρίπτονται.

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

Σενάριο 3

Καθορίζετε μια κοινή παράσταση πίνακα χρησιμοποιώντας την πρόταση WITH. Στη δήλωση 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 Για να επιλύσετε αυτό το πρόβλημα, αποκτήστε το πιο πρόσφατο 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).

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

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

ΜΕ το common_table_expression (Transact-SQL)Για περισσότερες πληροφορίες σχετικά με το sys.dm_exec_query_stats, επισκεφθείτε την ακόλουθη ιστοσελίδα του MSDN:

sys.dm_exec_query_stats (Transact-SQL)

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.

Σας βοήθησαν αυτές οι πληροφορίες;

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;
Πατώντας "Υποβολή" τα σχόλια σας θα χρησιμοποιηθούν για τη βελτίωση των προϊόντων και των υπηρεσιών της Microsoft. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×