Συμπτώματα
Ας υποθέσουμε ότι έχετε μια αποθηκευμένη διαδικασία 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 για την περιγραφή ενημερώσεων λογισμικού.