KB4010162-FIX: sistemos teigti atsitinka, kai Transact-SQL saugomą procedūrą su "TVP" argumentas yra iškviestas iš SQLCLR procedūros

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"

Naujausi kaupiamieji naujinimai, skirti "SQL Server 2014"

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.

Reikia daugiau pagalbos?

Tobulinkite savo įgūdžius
Ieškoti mokymo
Pirmiausia gaukite naujų funkcijų
Prisijungti prie "Microsoft Insider"

Ar ši informacija buvo naudinga?

Dėkojame už jūsų atsiliepimus!

×