Ισχύει για
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) που έχει έναν περιορισμό ως όρισμα:

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 για την περιγραφή ενημερώσεων λογισμικού.

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

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

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