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

Συμπτώματα

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

create type TestTvpType as table   

(

  id int primary key, -- UNIQUE will also do the trick

  data int

); 

go 

create procedure TestTvpProc @tvp TestTvpType readonly

as

begin

  select * from @tvp;

end;

go

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

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

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

       {

              sum = 0;

              DataTable myDataTable = new DataTable("TestTvpType");

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

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

              // Populate the TVP so it will trigger a PRIMARY KEY VIOLATION error

              myDataTable.Rows.Add(1, 1000);

              myDataTable.Rows.Add(1, 2000);

              SqlParameter parameter = new SqlParameter();

              parameter.ParameterName = "@tvp";

              parameter.SqlDbType = System.Data.SqlDbType.Structured;

              parameter.Value = myDataTable;

              SqlCommand command = new SqlCommand("TestTvpProc", connection);

              command.CommandType = CommandType.StoredProcedure;

              command.Parameters.Add(parameter);

              connection.Open();

              using (SqlDataReader reader = command.ExecuteReader())

              {

                     while (reader.Read())

                     {

                           …;

                     }

              }

       }

}

Επίλυση

Αυτό το ζήτημα διορθώνεται με τις ακόλουθες αθροιστικές ενημερώσεις για τον 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 2016

Πιο πρόσφατες αθροιστικές ενημερώσεις για τον SQL Server 2014

Κατάσταση

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

 

Αναφορές

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

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

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

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

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

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

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

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

×