KB2715289 - ΕΠΙΔΙΌΡΘΩΣΗ: Εσφαλμένα αποτελέσματα κατά τη μετατροπή μιας στήλης datetimeoffset σε στήλη smalldatetime στο SQL Server 2008 R2 ή στο SQL Server 2012, όταν υπάρχει ευρετήριο στη στήλη datetimeoffset

Ισχύει για
SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2012 Business Intelligence SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2012 Enterprise Core

Η Microsoft διανέμει τις ενημερώσεις κώδικα του Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) ως ένα αρχείο με δυνατότητα λήψης. Επειδή οι ενημερώσεις κώδικα είναι αθροιστικές, κάθε νέα έκδοση περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ενημερώσεις κώδικα ασφαλείας που συμπεριλήφθηκαν με το προηγούμενο SQL Server 2008 R2 Service Pack 1 (SP1) έκδοση της ενημέρωσης κώδικα.

Συμπτώματα

Εξετάστε το ακόλουθο σενάριο:

  • Έχετε μια στήλη τύπου δεδομένων datetimeoffset σε έναν πίνακα στο Microsoft SQL Server 2008 R2 ή στο Microsoft SQL Server 2012.
  • Μπορείτε να δημιουργήσετε ένα ευρετήριο στη στήλη datetimeoffset.
  • Μπορείτε να μετατρέψετε τον τύπο δεδομένων datetimeoffset σε τύπο δεδομένων smalldatetime χρησιμοποιώντας τη συνάρτηση CAST ή CONVERT χωρίς το όρισμα στυλ ή όταν η τιμή του ορίσματος στυλ είναι 0.
  • Το αποτέλεσμα της συνάρτησης CAST ή CONVERT χρησιμοποιείται σε ένα φίλτρο σε ένα ερώτημα Transact-SQL.
  • Μπορείτε να εκτελέσετε το ερώτημα Transact-SQL.

Σε αυτό το σενάριο, το αποτέλεσμα που επιστρέφεται από το ερώτημα είναι εσφαλμένο, επειδή το φίλτρο δεν λειτουργεί σωστά. Για παράδειγμα, ας υποθέσουμε ότι η στήλη datetimeoffset που ονομάζεται "Date" περιέχει τις ακόλουθες τιμές:

  • 2011-05-21 23:00:00 -01:00
  • 2011-05-21 23:00:00 +00:00
  • 2011-05-21 23:00:00 +01:00

Μπορείτε να εκτελέσετε το ακόλουθο ερώτημα:

SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'

Το αποτέλεσμα του ερωτήματος επιστρέφει μόνο μία γραμμή. Ωστόσο, το αναμενόμενο αποτέλεσμα θα πρέπει να επιστρέφει γραμμές και για τις τρεις τιμές.

Επίλυση

Πληροφορίες αθροιστικής ενημέρωσης

SQL Server 2012

Η επιδιόρθωση για αυτό το ζήτημα κυκλοφόρησε πρώτα στην αθροιστική ενημερωμένη έκδοση 3 για SQL Server 2012. Για περισσότερες πληροφορίες σχετικά με αυτό το πακέτο αθροιστική ενημερωμένη έκδοση, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

2723749 Πακέτο αθροιστικών ενημερώσεων 3 για το SQL Server 2012Σημείωση Επειδή το build που είναι αθροιστικές, κάθε νέα έκδοση της ενημέρωσης κώδικα περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ενημερώσεις κώδικα ασφαλείας που συμπεριλήφθηκαν με την προηγούμενη SQL Server 2012 έκδοση της ενημέρωσης κώδικα. Η Microsoft συνιστά να εξετάσετε την εφαρμογή της πιο πρόσφατης έκδοσης της ενημέρωσης κώδικα που περιέχει αυτήν την επείγουσα επιδιόρθωση. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:

2692828 Οι εκδόσεις του SQL Server 2012 που κυκλοφόρησαν μετά την κυκλοφορία του SQL Server 2012 Πρέπει να εφαρμόσετε μια επείγουσα επιδιόρθωση του SQL Server 2012 σε μια εγκατάσταση του SQL Server 2012.

SQL Server 2008 R2 Service Pack 2

Η ενημέρωση κώδικα για αυτό το ζήτημα κυκλοφόρησε πρώτα στην αθροιστική ενημερωμένη έκδοση 1 για το SQL Server 2008 R2 Service Pack 2. Για περισσότερες πληροφορίες σχετικά με τον τρόπο απόκτησης αυτού του πακέτου αθροιστική ενημερωμένη έκδοση, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

2720425 Αθροιστική ενημερωμένη έκδοση πακέτου 1 για SQL Server 2008 R2 Service Pack 2Σημείωση Επειδή το build που είναι αθροιστικές, κάθε νέα έκδοση της ενημέρωσης κώδικα περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ενημερώσεις κώδικα ασφαλείας που συμπεριλήφθηκαν με την προηγούμενη έκδοση SQL Server 2008 R2 της ενημέρωσης κώδικα. Συνιστάται να εξετάσετε την εφαρμογή της πιο πρόσφατης έκδοσης ενημερώσεων κώδικα που περιέχει αυτήν την επείγουσα επιδιόρθωση. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:

2730301 Οι εκδόσεις του SQL Server 2008 R2 που κυκλοφόρησαν μετά την κυκλοφορία του SQL Server 2008 R2 Service Pack 2

SQL Server 2008 R2 SP1

Η επιδιόρθωση για αυτό το πρόβλημα κυκλοφόρησε πρώτα στην αθροιστική ενημερωμένη έκδοση 7. Για περισσότερες πληροφορίες σχετικά με τον τρόπο απόκτησης αυτού του πακέτου αθροιστική ενημερωμένη έκδοση για το SQL Server 2008 R2 Service Pack 1, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

2703282 Πακέτο αθροιστικών ενημερώσεων 7 για το SQL Server 2008 R2 SP1Note Επειδή το build που είναι αθροιστικές, κάθε νέα έκδοση της ενημέρωσης κώδικα περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ενημερώσεις κώδικα ασφαλείας που συμπεριλήφθηκαν με την προηγούμενη έκδοση SQL Server 2008 R2 Service Pack 1 της ενημέρωσης κώδικα. Συνιστάται να εξετάσετε την εφαρμογή της πιο πρόσφατης έκδοσης ενημερώσεων κώδικα που περιέχει αυτήν την επείγουσα επιδιόρθωση. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:

2567616 Οι SQL Server δομές του 2008 R2 κυκλοφόρησαν μετά την κυκλοφορία του SQL Server 2008 R2 SP1

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

Για να αναπαραγάγετε το ζήτημα, ακολουθήστε τα εξής βήματα:

  1. Εκτελέστε το ακόλουθο ερώτημα για να δημιουργήσετε έναν πίνακα με μια στήλη datetimeoffset και να εισαγάγετε ορισμένες εγγραφές:

    ΔΗΜΙΟΥΡΓΊΑ ΠΊΝΑΚΑ #TestTimeZones (dto datetimeoffset(0)); ΠΗΓΑΊΝΕΤΕ ΕΙΣΑΓΩΓΉ ΣΕ ΤΙΜΈΣ #TestTimeZones(dto) ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); ΜΕΤΑΒΑΣΗ

  2. Εκτελέστε το ακόλουθο ερώτημα και θα δείτε ότι και οι τρεις τιμές παρατίθενται σωστά στο αποτέλεσμα που επιστρέφεται:

    ΔΗΛΩΣΗ @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;

  3. Εκτελέστε το ακόλουθο ερώτημα για να δημιουργήσετε ένα ευρετήριο στη στήλη "dto" και να επαναλάβετε το ίδιο ερώτημα:

    ΔΗΜΙΟΥΡΓΊΑ IX_testTimeZones_Dto ΕΥΡΕΤΗΡΊΟΥ ΣΤΟ #TestTimeZones(dto); GO -- Επανάληψη του ίδιου ερωτήματος DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; ΜΕΤΑΒΑΣΗ

  4. Εκτελέστε ξανά το ερώτημα στο βήμα 2. Αυτή τη φορά, το ερώτημα επιστρέφει μόνο μία γραμμή.

  5. Εκτελέστε το ακόλουθο ερώτημα για να διαγράψετε το ευρετήριο και τον πίνακα που δημιουργήσατε:

    DROP INDEX IX_testTimeZones_Dto ΣΤΟ #TestTimeZones. ΠΗΓΑΊΝΕΤΕ DROP TALBE #TestTimeZones; ΜΕΤΑΒΑΣΗ

Παραπομπές

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

Γενικές πληροφορίες σχετικά με τις συναρτήσεις CAST και CONVERT στο SQL Server

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα που αφορά τα προϊόντα της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".