Simptomai
Tarkime, kad turite Transact-SQL saugomą procedūrą, pvz., tai yra lentelės reikšmių parametras (TVP), kuris turi apribojimą kaip 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
Scenarijaus atveju, kai ši procedūra iškviesta iš SQLCLR saugomos procedūros , o argumentas yra pažeistas , gali būti, kad klaidingai gaunate sistemos teiginį, kai jūs tikitės gauti klaidos pranešimą "apribojimo pažeidimas".
Toliau pateikiamas SQLCLR procedūros, gaminančios saugomą procedūrą apribojantį apribojimą, pavyzdys:
[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())
{
…;
}
}
}
}
Sprendimas
Ši problema išspręsta SQL serverio kaupiamajame naujinime:
Kaupiamasis naujinimas 5 SQL serverio 2016 RTM
Kaupiamasis naujinimas 2 SQL serverio 2016 SP1
Kaupiamasis naujinimas 4 SQL serverio 2014 2 pakeitimų paketui
Pastaba Šis naujinimas sukelia klaidos pranešimo tinkamą "CONSTRAINT pažeidimo" grąžinimą.
Kiekvienas naujas Kaupiamasis naujinimas, skirtas "SQL Server", yra visos karštosios pataisos ir saugos pataisos, kurios buvo įtrauktos į ankstesnį kaupiamąjį naujinimą. Peržiūrėkite naujausius kaupiamuosius SQL serverio naujinimus:
Naujausias Kaupiamasis naujinimas, skirtas "SQL Server 2016"
Statusą
"Microsoft" patvirtino, kad tai yra "Microsoft" produktų, išvardytų skyriuje "taikoma", problema.
Nuorodos
Sužinokite apie terminologiją "Microsoft" naudoja programinės įrangos naujinimams apibūdinti.