KB4010162 - ΕΠΙΔΙΌΡΘΩΣΗ: Παρουσιάζεται διεκδίκηση συστήματος όταν καλείται μια αποθηκευμένη διαδικασία Transact-SQL με όρισμα TVP από μια διαδικασία SQLCLR

Ισχύει για
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

Συμπτώματα

Ας υποθέσουμε ότι έχετε μια αποθηκευμένη διαδικασία Transact-SQL, όπως η ακόλουθη που λαμβάνει ως όρισμα μια παράμετρο πίνακα τιμής (TVP) που έχει έναν περιορισμό:

δημιουργία τύπου TestTvpType ως πίνακα

(

id int πρωτεύον κλειδί, -- UNIQUE θα κάνει επίσης το τέχνασμα

data int

);

μετάβαση

δημιουργία διαδικασίας TestTvpProc @tvp TestTvpType μόνο για ανάγνωση

ως

εκκίνηση

επιλέξτε * από @tvp;

τέλος;

μετάβαση

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

      

Ακολουθεί ένα παράδειγμα μιας διαδικασίας SQLCLR που παράγει μια παραβίαση περιορισμού για την αποθηκευμένη διαδικασία:

      

[Διαδικασία_Sql]

δημόσιο στατικό κενό ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

using (SqlConnection connection = new SqlConnection("context connection=true"))

{

άθροισμα = 0;

DataTable myDataTable = new DataTable("TestTvpType");

myDataTable.Columns.Add("id", typeof(Int32));

myDataTable.Columns.Add("data", typeof(Int32));

Συμπληρώστε το TVP, ώστε να ενεργοποιήσει ένα σφάλμα ΠΑΡΑΒΙΑΣΗΣ ΠΡΩΤΕΥΟΝΤΟΣ ΚΛΕΙΔΙΟΥ

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

Παράμετρος SqlParameter = νέα SqlParameter();

παράμετρος. ParameterName = "@tvp";

παράμετρος. SqlDbType = System.Data.SqlDbType.Structured;

παράμετρος. Value = myDataTable;

Εντολή SqlCommand = νέα SqlCommand("TestTvpProc", σύνδεση);

εντολή. CommandType = CommandType.StoredProcedure;

εντολή. Parameters.Add(παράμετρος);

σύνδεση. Open();

χρησιμοποιώντας την εντολή (SqlDataReader = . ExecuteReader())

{

ενώ (αναγνώστης. Ανάγνωση ())

{

…;

}

}

}

}

Επίλυση

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

Αθροιστική ενημερωμένη έκδοση 5 για SQL Server 2016 RTM

Αθροιστική ενημερωμένη έκδοση 2 για SQL Server 2016 SP1

Αθροιστική ενημερωμένη έκδοση 4 για SQL Server 2014 Service Pack 2

Σημείωση Αυτή η ενημερωμένη έκδοση προκαλεί την επιστροφή του σωστού μηνύματος λάθους "παραβίαση περιορισμού".

Πληροφορίες σχετικά με τις αθροιστικές ενημερώσεις για SQL Server

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

Τελευταία αθροιστική ενημέρωση για το SQL Server 2016

Τελευταίες αθροιστικές ενημερώσεις για το SQL Server 2014

Κατάσταση

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

Παραπομπές

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