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

Συμπτώματα

Οι συναρτήσεις User-Defined (UDF) που υλοποιούνται στο Transact-SQL και επιστρέφουν μία τιμή δεδομένων είναι γνωστές ως T-SQL Scalar User-Defined Functions (UDFs). 

Η Microsoft SQL Server 2019 παρουσίασε τη δυνατότητα Scalar UDF Inlining. Αυτή η δυνατότητα μπορεί να βελτιώσει τις επιδόσεις των ερωτημάτων που καλούν T-SQL Scalar UDFs, στα οποία η εκτέλεση UDF είναι το κύριο σημείο συμφόρησης. Η inlining T-SQL Scalar UDF μετατρέπει αυτόματα τα ενσωματωμένα UDF σε σχεσιακές παραστάσεις. 

Αυτή η συγκεντρωτική ενημέρωση περιλαμβάνει πολλές επιδιορθώσεις σε όλες τις ακόλουθες περιοχές για σενάρια στα οποία ένα ερώτημα που χρησιμοποιεί Scalar UDF Inlining μπορεί να επιστρέψει σφάλμα ή μη αναμενόμενα αποτελέσματα:

  • Παρουσιάζεται σφάλμα ασυμφωνίας τύπου εάν ο τύπος επιστροφής UDF είναι sql_variant (προστέθηκε στο SQL Server 2019 CU2).

  • Η κλήση UDF απόsp_executesql ματαιώνει την εκτέλεση (προστέθηκε στο SQL Server 2019 CU2).

  • Τα αρχεία UDF που αναφέρονται σε ετικέτες χωρίς συσχετισμένη εντολή GOTO επιστρέφουν εσφαλμένα αποτελέσματα (προστέθηκαν στο SQL Server 2019 CU2).

  • Οι συνθήκες εκτός μνήμης και οι διαρροές μνήμης παρουσιάζονται λόγω πολύ μεγάλων ανυσμάτων UDF (προστίθενται στο SQL Server 2019 CU2).

  • Οι μεταβλητές που δεν έχουν ξεκινήσει και χρησιμοποιούνται στις προτάσεις συνθήκης (IF-ELSE) προκαλούν σφάλματα (προστίθενται στο SQL Server 2019 CU2).

  • Παρουσιάζεται ρητό σφάλμα μετατροπής εάν μια UDF διαθέτει την παράμετρο sql_variant(προστέθηκε στο SQL Server 2019 CU7).

  • Παρουσιάζεται σφάλμα όταν οι αναφορές της ανυσματικής συνάρτησης CHECKSUM(προστίθενται στο SQL Server 2019 CU7).

  • Η επίκληση UDF που έχει μεγάλο αριθμό ανυσματικών παραστάσεων επαναξιολόγησης μπορεί να προκαλέσει σφάλμα μη απόδοσης χρονοδιαγράμματος (προστέθηκε στο SQL Server 2019 CU7).

    Σημείωση: Η επιδιόρθωση για αυτό το πρόβλημα μπορεί ορισμένες φορές να προκαλέσει παλινδρόμηση των επιδόσεων. Για να μετριάσετε αυτήν την παλινδρόμηση επιδόσεων, μπορείτε να απενεργοποιήσετε την αρχική επιδιόρθωση, ενεργοποιώντας τη σημαία ανίχνευσης (TF) 13156.

    Η Microsoft εργάζεται για την επιδιόρθωσή της για αυτήν την παλινδρόμηση επιδόσεων, η οποία θα είναι διαθέσιμη σε μελλοντική cu.

  • Παρουσιάζεται σφάλμα όταν το ερώτημα αναφοράς UDF χρησιμοποιεί OPTION (RECOMPILE)(προστέθηκε στο SQL Server 2019 CU7).

  • Τα σφάλματα δικαιωμάτων παρουσιάζονται όταν οι προβολές καλούν ενσωματωμένα UDF (προστίθενται στο SQL Server 2019 CU9).

  • Οι παραβιάσεις πρόσβασης παρουσιάζονται όταν χρησιμοποιείται τοquery_tsql_scalar_udf_inlinedXEvent (προστίθεται στο SQL Server 2019 CU9).

  • Παρουσιάζεται ασυνέπεια λόγω της ασυνέπειας της υπογράμμισης UDF Scalar UDF που δεν τηρεί την υπόδειξη ερωτήματος QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n(προστέθηκε στο SQL Server 2019 CU9).

  • Οι inlining UDFs περιέχουν συναθροίσεις που μπορούν να προκαλέσουν σφάλματα χρονοδιαγραμμάτων που δεν αποδίδουν (προστίθενται στο SQL Server 2019 CU9).

  • Τα σφάλματα έλλειψης μνήμης προκύπτουν λόγω μιας ακολουθίας ανυσματικών λειτουργιών στην ίδια μεταβλητή σε μπλοκ υπό όρους (προστέθηκαν στο SQL Server 2019 CU9).

  • Μια παραβίαση πρόσβασης παρουσιάζεται όταν ένα αντικείμενο καλείται μια ανυσματική ενσωματωμένη UDF (UDF1) που έχει ανυσματική ενσωματωμένη UDF (UDF2) που χρησιμοποιείται ως παράμετρος εισόδου μετά την αναβάθμιση σε CU9 (προστίθεται στο SQL Server 2019 CU11).

  • Τα inlining UDFs μπορεί να προκαλέσουν σφάλματα και να δημιουργήσουν κωδικούς σφάλματος 6846, 1011 και 107 (προστέθηκαν στο SQL Server 2019 CU11).

  • Τα ενσωματωμένα UDF που εκτελούνται ως λογαριασμός μη sysadmin ενδέχεται να επιστρέψουν το μήνυμα σφάλματος "Παρουσιάστηκε σοβαρό σφάλμα στην τρέχουσα εντολή.  Τα αποτελέσματα, εάν υπάρχουν, θα πρέπει να απορριφθούν" (θα πρέπει να προστεθούν στο SQL Server 2019 CU16).

  • Παρουσιάζεται παραβίαση πρόσβασης κατά την κλήση προσωρινών πινάκων μέσα σε αρχεία UDF με τη χρήση συνωνύμων (προστίθενται στο Microsoft SQL Server 2022 CU1 και SQL Server 2019 CU19).

  • Παρουσιάζεται παραβίαση πρόσβασης εάν ο ορισμός UDF περιέχει μόνο GOTO ετικέτες και μια πρότασηRETURN (προστέθηκε στο SQL Server 2022 CU1 και SQL Server 2019 CU19).

  • Scalar UDF returns results in different date and time formats when the Scalar UDF Inlining feature is enabled (added in SQL Server 2022 CU3 and SQL Server 2019 CU20).

Αυτή η συγκεντρωτική ενημέρωση αποκλείει επίσης την διάρθρωση στα ακόλουθα σενάρια:

  • Εάν η UDF παραπέμπει σε ορισμένες εγγενείς συναρτήσεις (για παράδειγμα, @@ROWCOUNT) που μπορεί να αλλάξουν τα αποτελέσματα όταν είναι ενσωματωμένα (προστίθενται στο SQL Server 2019 CU2).

  • Όταν οι συναρτήσεις συγκεντρωτικών αποτελεσμάτων μεταβιβάζονται ως παράμετροι σε ανυσματικό UDF (προστίθεται στο SQL Server 2019 CU2).

  • Εάν οι αναφορές UDF αναφέρονται σε ενσωματωμένες προβολές (για παράδειγμα: OBJECT_ID) (προστίθενται στο SQL Server 2019 CU2).

  • Εάν η UDF χρησιμοποιεί μεθόδους XML (προστίθενται στο SQL Server 2019 CU4).

  • Εάν η UDF περιέχει μια πρόταση SELECTπου χρησιμοποιεί τον όροORDER BYαλλά όχι TOP 1(προστέθηκε στο SQL Server 2019 CU4).

  • Εάν η πρότασηSELECT εκτελέσει μια ανάθεση μαζί με τον όρο ORDER BY (για παράδειγμα, SELECT @x = @x +1 FROM table ORDER BY column_name) (προστέθηκε στο SQL Server 2019 CU4).

  • Εάν η UDF περιέχει πολλές προτάσεις RETURN (προστέθηκαν στο SQL Server 2019 CU5).

  • Εάν η UDF καλείται από μια πρόταση RETURN (προστέθηκε στο SQL Server 2019 CU5).

  • Εάν η UDF παραπέμπει στη συνάρτηση STRING_AGG (προστέθηκε στο SQL Server 2019 CU5).

  • Εάν ο ορισμός UDF αναφέρεται σε απομακρυσμένους πίνακες (προστέθηκε στο SQL Server 2019 CU6).

  • Εάν το ερώτημα κλήσης UDF χρησιμοποιεί GROUPING SETS, CUBEή ROLLUP (προστέθηκε στο SQL Server 2019 CU6).

  • Εάν το ερώτημα κλήσης UDF περιέχει μια μεταβλητή που χρησιμοποιείται ως παράμετρος UDF για την ανάθεση (για παράδειγμα, SELECT @y=2, @x=UDF(@y)) (προστέθηκε στο SQL Server 2019 CU6).

  • Εάν η UDF παραπέμπει σε κρυπτογραφημένες στήλες (προστέθηκαν στο SQL Server 2019 CU11).

  • Εάν η UDF περιέχει αναφορές σε WITH XMLNAMESPACES(προστέθηκε στο SQL Server 2019 CU11).

  • Εάν το ερώτημα που καλεί την UDF έχει κοινές παραστάσεις πίνακα (CTEs) (που προστέθηκαν στο SQL Server 2019 CU11).

  • Εάν ο ορισμός UDF περιέχει προσωρινούς πίνακες ή συνώνυμα για τους προσωρινούς πίνακες (που προστέθηκαν στο SQL Server 2022 CU1 και SQL Server 2019 CU19).

  • Εάν ο ορισμός UDF έχει μια πρότασηSELECTμαζί με έναν όροDISTINCTσε πολλές στήλες ανάθεσης (που προστέθηκε στο SQL Server 2022 CU4 και SQL Server 2019 CU20).

Μετά την αναβάθμιση σε SQL Server 2019 CU2, αλλά πριν από την αναβάθμιση σε SQL Server 2019 CU5, θα πρέπει να αξιολογήσετε ξανά εάν μια UDF είναι κατάλληλη για διάρθρωση. Για να το κάνετε αυτό, ανανεώστε κατάλληλα ανυγραφικά UDF με μία από τις ακόλουθες μεθόδους:

  • Εκτελέστε sp_refreshsqlmodule για κατάλληλα ανυγραφικά UDF. Για περισσότερες πληροφορίες σχετικά με αυτή την αποθηκευμένη διαδικασία συστήματος, ανατρέξτε στο θέμα sp_refreshsqlmodule (Transact-SQL).

  • Αλλάξτε ή δημιουργήστε εκ νέου την υπάρχουσα ανυσματική UDF χρησιμοποιώντας υπάρχοντες ορισμούς, δικαιώματα και ορισμό ιδιοτήτων. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα ALTER FUNCTION (Transact-SQL).

Η ακόλουθη εντολή δημιουργεί μια δέσμη ενεργειών για την ανανέωση των μετα-δεδομένων των υπαρχόντων ανυσμάτων UDF:

/*

Generates a script that can be used to refresh all active inlineable scalar UDFs.

Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.

*/

SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

FROM sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

Σημείωση: Μετά την αναβάθμιση σε SQL Server 2019 CU5, θα αντλήσουμε αυτόματα την ενσωματωμένη δυνατότητα UDF κατά τη διάρκεια της μεταγλώττισης ξανά.

Επίλυση

Αυτό το πρόβλημα έχει διορθωθεί στις ακόλουθες αθροιστικές ενημερώσεις για SQL Server:

Κάθε νέα συγκεντρωτική ενημέρωση για SQL Server περιέχει όλες τις άμεσες επιδιορθώσεις και όλες τις επιδιορθώσεις ασφαλείας που περιλαμβάνονταν στην προηγούμενη συγκεντρωτική ενημέρωση. Δείτε τις πιο πρόσφατες συγκεντρωτικές ενημερώσεις για SQL Server:

Κατάσταση

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

Αναφορές

Ενημερωθείτε σχετικά με την ορολογία που χρησιμοποιεί η Microsoft για την περιγραφή ενημερώσεων λογισμικού.

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

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

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

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

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

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;

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

×