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

Příznaky

Předpokládejme, že máte uloženou proceduru Transact-SQL, třeba následující, která používá parametr s hodnotou tabulky (TVP), který má omezení 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

Ve scénáři, kdy je tento postup volán z uložené procedury SQLCLR a u argumentu je porušené omezení , může se stát, že nesprávně obdržíte systémovou hodnotu, když byste očekávali, že se zobrazí chybová zpráva "porušení omezení".

V následujícím příkladu SQLCLR procedura, která v uložené proceduře produkuje porušení omezení:

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

                     {

                           …;

                     }

              }

       }

}

Řešení

Tento problém je opravený v následujících kumulativních aktualizacích systému SQL Server:

Kumulativní aktualizace 5 pro SQL Server 2016 RTM

Kumulativní aktualizace 2 pro SQL Server 2016 SP1

Kumulativní aktualizace 4 pro SQL Server 2014 Service Pack 2

Poznámka: Tato aktualizace způsobí, že se zobrazí chybová zpráva o porušení omezení správnosti.

Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace SQL serveru:

Nejnovější kumulativní aktualizace pro SQL Server 2016

Nejnovější kumulativní aktualizace pro SQL Server 2014

Stav

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.

 

Odkazy

Informace o terminologii , kterou Microsoft používá k popisu aktualizací softwaru.

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.