Gjelder for
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

Symptomer

Anta at du har en Transact-SQL-lagret prosedyre som følgende som tar en tabell objektegenskap parameter (TVP) som har en begrensning 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 et scenario der denne prosedyren kalles fra en SQLCLR lagret prosedyre, og betingelsen er brutt for argumentet, du kan få et system assert feil når du forventer å motta en feilmelding av typen "brudd på begrensning".

Følgende er et eksempel på en SQLCLR prosedyre som produserer et brudd på begrensning for den lagrede prosedyren:

[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

Dette problemet er løst i følgende kumulative oppdateringer for SQL Server:

Kumulativ oppdatering 5 for SQL Server 2016 RTM

Samleoppdatering 2 for SQL Server 2016 SP1

Kumulativ oppdatering 4 for SQL Server 2014 Service Pack 2

Obs! Denne oppdateringen fører til retur av den riktige feilmeldingen "brudd på begrensning".

Hver nye kumulativ oppdatering for SQL Server inneholder alle hurtigreparasjoner og sikkerhetsoppdateringer reparasjonene som er inkludert i den forrige kumulative oppdateringen. Sjekk ut de nyeste kumulative oppdateringene for SQL Server:

Nyeste kumulative oppdateringen for SQL Server-2016

Nyeste kumulative oppdateringer for SQL Server-2014

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen "Gjelder for".

 

Referanser

Lær mer om terminologien som Microsoft bruker til å beskrive oppdateringer av programvare.

Trenger du mer hjelp?

Vil du ha flere alternativer?

Utforsk abonnementsfordeler, bla gjennom opplæringskurs, finn ut hvordan du sikrer enheten og mer.