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

Príznaky

Predpokladajme, že máte uloženú procedúru Transact-SQL, ako je napríklad nasledujúca hodnota, ktorá má parameter s hodnotou tabuľky (TVP) s obmedzením ako 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

V scenári, v ktorom sa tento postup nazýva z SQLCLR uloženej procedúry a obmedzenie je v argumente porušené, môže sa stať, že nesprávne dostanete systém, keď očakávate, že sa zobrazí chybové hlásenie obmedzenie porušenia.

Nasleduje príklad SQLCLR postupu, ktorý spôsobuje porušenie obmedzenia uloženej procedúry:

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

                     {

                           …;

                     }

              }

       }

}

Riešenie

Tento problém je vyriešený v nasledujúcich kumulatívnych aktualizáciách pre SQL Server:

Kumulatívna aktualizácia 5 pre SQL Server 2016 RTM

Kumulatívna aktualizácia 2 pre SQL Server 2016 SP1

Kumulatívna aktualizácia 4 pre SQL Server 2014 Service Pack 2

Poznámka: Táto aktualizácia spôsobí vrátenie chybového hlásenia o chybnom obmedzení obmedzenia.

Každá nová Kumulatívna aktualizácia pre SQL Server obsahuje všetky opravy hotfix a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcej kumulatívnej aktualizácii. Pozrite si najnovšie kumulatívne aktualizácie pre SQL Server:

Posledná Kumulatívna aktualizácia pre SQL Server 2016

Najnovšie kumulatívne aktualizácie pre SQL Server 2014

Stav

Spoločnosť Microsoft potvrdzuje, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v tomto článku v časti Informácie v tomto článku sa týkajú nasledujúcich produktov.

 

Odkazy

Oboznámte sa s terminológiou , ktorú spoločnosť Microsoft používa na popis aktualizácií softvéru.

Potrebujete ďalšiu pomoc?

Chcete ďalšie možnosti?

Môžete preskúmať výhody predplatného, prehľadávať školiace kurzy, naučiť sa zabezpečiť svoje zariadenie a ešte oveľa viac.

Komunity pomôžu s kladením otázok a odpovedaním na ne, s poskytovaním pripomienok a so získavaním informácií od odborníkov s bohatými znalosťami.