Symptomy
Załóżmy, że masz procedurę przechowywaną języka Transact-SQL, taką jak poniższe, które pobierają parametr z wartościami przechowywanymi w tabeli (TVP), który ma ograniczenie jako argument:
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
W scenariuszu, w którym ta procedura jest wywoływana z procedury składowanej SQLCLR, a ograniczenie jest naruszone dla tego argumentu, użytkownik może błędnie otrzymać potwierdzenie systemu, jeśli będzie oczekiwać, że zostanie wyświetlony komunikat o błędzie "naruszenie ograniczeń".
Poniżej przedstawiono przykład procedury SQLCLR, która stanowi naruszenie ograniczeń procedury składowanej:
[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())
{
…;
}
}
}
}
Rozwiązanie
Ten problem został rozwiązany w następujących zbiorczych aktualizacjach programu SQL Server:
Zbiorcza aktualizacja 5 dla programu SQL Server 2016 RTM
Zbiorcza aktualizacja 2 dla programu SQL Server 2016 z dodatkiem SP1
Zbiorcza aktualizacja 4 dla programu SQL Server 2014 z dodatkiem Service Pack 2
Uwaga Ta aktualizacja powoduje zwrócenie poprawnego komunikatu o błędzie "naruszenie ograniczeń".
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki hotfix i poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2016
Najnowsze aktualizacje zbiorcze dla programu SQL Server 2014
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".
Informacje
Dowiedz się więcej o terminologii używanej przez firmę Microsoft do opisywania aktualizacji oprogramowania.