Gäller för
SQL 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

Symptom

Anta att du har en Transact-SQL-lagrad procedur som följer en tabell värdes parameter (TVP) som har ett villkor som 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

I ett scenario där den här proceduren anropas från en lagrad SQLCLR-procedur och begränsningen uppträder för argumentet är det möjligt att du felaktigt får ett system assert, när du förväntar dig att få ett fel meddelande om "Restriktionsfel".

Här följer ett exempel på ett SQLCLR-förfarande som ger upphov till en begränsning av den lagrade proceduren:

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

                     {

                           …;

                     }

              }

       }

}

Lösning

Det här problemet är åtgärdat i följande kumulativa uppdateringar för SQL Server:

Kumulativ uppdatering 5 för SQL Server 2016 RTM

Kumulativ uppdatering 2 för SQL Server 2016 SP1

Kumulativ uppdatering 4 för SQL Server 2014 Service Pack 2

Obs! den här uppdateringen ger upphov till fel meddelandet "Restriktionsfel".

Varje ny kumulativ uppdatering för SQL Server innehåller alla snabb korrigeringar och säkerhets korrigeringar som fanns i den föregående kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:

Senaste kumulativa uppdateringen för SQL Server 2016

Senaste kumulativa uppdateringar för SQL Server 2014

Status

Microsoft har bekräftat att det här är ett problem i Microsoft-produkterna som nämns i "gäller".

 

Referenser

Lär dig mer om terminologin som används av Microsoft för att beskriva program varu uppdateringar.

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.