KB4010162 — LABOJUMS: Sistēmas apliecinājums rodas, kad Transact-SQL saglabāta procedūra ar TVP argumentu tiek izsaukta no SQLCLR procedūras

Attiecas uz
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

Pazīmes

Pieņemsim, ka jums ir Transact-SQL saglabāta procedūra, piemēram, tālāk norādītā, kura kā argumentu izmanto tabulas vērtības parametru (TVP), kuram ir ierobežojums:

create type TestTvpType as table

(

id int primary key, -- UNIQUE arī paveiks triku

data int

);

doties

create procedure TestTvpProc @tvp TestTvpType readonly

sākt

izvēlieties * no @tvp;

beigas;

doties

Scenārijā, kad šī procedūra tiek izsaukta no SQLCLR saglabātas procedūras un tiek pārkāpts argumenta ierobežojums, iespējams, kļūdaini tiks parādīts sistēmas apgalvojums, lai gan varētu tikt parādīts kļūdas ziņojums "ierobežojuma pārkāpums".

      

Tālāk ir sniegts piemērs ar SQLCLR procedūru, kas saglabātai procedūrai rada ierobežojuma pārkāpumu:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

izmantojot (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));

Aizpildiet TVP, lai tas izraisītu PRIMARY KEY VIOLATION kļūdu

myDataTable.Rows.Add(1; 1000);

myDataTable.Rows.Add(1, 2000);

Parametrs SqlParameter = new SqlParameter();

parametru. ParameterName = "@tvp";

parametru. SqlDbType = System.Data.SqlDbType.Structured;

parametru. Value = myDataTable;

Komanda SqlCommand = jauna SqlCommand("TestTvpProc", savienojums);

komanda. CommandType = CommandType.StoredProcedure;

komanda. parametrs Parameters.Add();

savienojums. Atvērts();

izmantojot komandu (SqlDataReader reader = ExecuteReader())

{

kamēr (lasītājs. Lasiet())

{

…;

}

}

}

}

Risinājums

Šī problēma ir novērsta šādos SQL Server kumulatīvajos atjauninājumos:

5. kumulatīvais atjauninājums sistēmai SQL Server 2016 RTM

SQL Server 2016 SP1 2. kumulatīvais atjauninājums

SQL Server 2014 2. servisa pakotnes 4. kumulatīvais atjauninājums

Piezīme Šis atjauninājums izraisa pareizā "constraint violation" kļūdas ziņojuma atgriešanu.

Par SQL Server kumulatīvajiem atjauninājumiem

Katrā jaunajā SQL Server kumulatīvajā atjauninājumā ir visi labojumfaili un drošības labojumi, kas bija iekļauti iepriekšējā kumulatīvajā atjauninājumā. Skatiet jaunākos SQL Server kumulatīvos atjauninājumus:

Jaunākais kumulatīvais atjauninājums SQL Server 2016

Jaunākie kumulatīvie atjauninājumi SQL Server 2014

Statuss

Microsoft apstiprināja, ka šī ir problēma Microsoft produktos, kas norādīti sadaļā "attiecas uz".

Atsauces

Uzziniet par terminoloģiju , ko Microsoft izmanto, lai aprakstītu programmatūras atjauninājumus.