Applies ToSQL 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

Sümptomid

Oletame, et teil on Transact-SQL-i salvestatud protseduur (nt järgmine, mis võtab tabelina hinnatud parameetri (TVP), millel on argumendina piirang .

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

Stsenaariumis, kus seda toimingut nimetatakse SQLCLR salvestatud protseduuriks ja kitsendust eiratakse argumendi korral, võib ilmneda valesti süsteemi kinnitus, kui loodate, et tõrketeade "kitsenduse rikkumine" kuvatakse.

Järgmises näites on SQLCLR, mis toodab salvestatud protseduurile piirangu rikkumist.

[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())

                     {

                           …;

                     }

              }

       }

}

Lahendus

See probleem on lahendatud SQL serveri järgmisi kumulatiivseid värskendusi.

Kumulatiivne Update 5 SQL Server 2016 RTM

Kumulatiivne Update 2 SQL Server 2016 SP1 jaoks

Kumulatiivne värskendus 4 SQL Server 2014 Service Pack 2 jaoks

Märkus See värskendus põhjustab tõrketeate "kitsenduse rikkumine" tagastamise tõrketeate.

Iga uus SQL serveri koondvärskenduses sisaldab kõiki Kiirparandusi ja turvaparandusi, mis kuulusid eelmisele kumulatiivsele versioonile. Vaadake SQL serveri kumulatiivseid värskendusi.

Uusim SQL Server 2016 koondvärskenduses

Uusimad kumulatiivsed värskendused SQL Server 2014

Olek

Microsoft on kinnitanud, et see probleem esineb jaotises "kehtib järgmiste toodete kohta" loetletud Microsofti toodetes.

 

Viited

Siit saate teada, Kuidas Microsoft kasutab tarkvaravärskenduste kirjeldamiseks.

Kas vajate veel abi?

Kas soovite rohkem valikuvariante?

Siin saate tutvuda tellimusega kaasnevate eelistega, sirvida koolituskursusi, õppida seadet kaitsma ja teha veel palju muud.

Kogukonnad aitavad teil küsimusi esitada ja neile vastuseid saada, anda tagasisidet ja saada nõu rikkalike teadmistega asjatundjatelt.