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

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 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_stats

WHERE statement_start_offset > statement_end_offset

AND

statement_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 AS
BEGIN
DECLARE @x int
SET @x=1;
WITH common_table_expression AS

(SELECT @x AS column1)

(SELECT @x=column1 FROM common_table_expression)

OPTION(RECOMPILE)
RETURN @x
END
Κατά την εκτέλεση ενός ερωτήματος “ επιλέξτε 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:
SQL Server 2008 Service Pack 2 CTP

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

Για να επιλύσετε αυτά τα ζητήματα, πρέπει να καταργήσετε τις παρενθέσεις από τη δήλωση που ακολουθεί την κοινή έκφραση πίνακα. Για παράδειγμα, σκεφτείτε τα εξής 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:
Με common_table_expression (Transact-SQL)
Για περισσότερες πληροφορίες σχετικά με την sys.dm_exec_query_stats, επισκεφθείτε την παρακάτω ιστοσελίδα MSDN:
sys.dm_exec_query_stats (Transact-SQL)

Ιδιότητες

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

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

 

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