KB4010162 - FIX: süsteemi kinnitus ilmneb, kui Transact-SQL salvestatud protseduuri TVP argumendi kutsutakse SQLCLR-i protseduuri

Rakenduskoht
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

Sümptomid

Oletame, et teil on Transact-SQL salvestatud protseduur, näiteks järgmine, mis võtab tabeli väärtus parameeter (TVP), mis on piirang argumendina:

create type TestTvpType as table

(

id int primary key, -- UNIQUE teeb ka triki

data int

);

mine

create procedure TestTvpProc @tvp TestTvpType readonly

kui

alustamine

select * from @tvp;

lõpp;

mine

Stsenaariumis, kus seda protseduuri kutsutakse SQLCLR-i salvestatud protseduurist ja piirangut on argumendi jaoks rikutud, võite saada süsteemi kinnituse valesti, kui eeldate, et kuvatakse tõrketeade "piirangu rikkumine".

      

Järgnevalt on toodud näide SQLCLR-protseduurist, mis tekitab salvestatud protseduurile kitsendusrikkumise.

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

using (SqlConnection connection = new SqlConnection("context connection=true"))

{

summa = 0;

DataTable myDataTable = new DataTable("TestTvpType");

myDataTable.Columns.Add("id", typeof(Int32));

myDataTable.Columns.Add("data", typeof(Int32));

Asustage TVP nii, et see käivitaks PRIMAARVÕTME RIKKUMISE tõrke

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameeter = uus SqlParameter();

parameetrit. ParameterName = "@tvp";

parameetrit. SqlDbType = System.Data.SqlDbType.Structured;

parameetrit. Väärtus = myDataTable;

SqlCommand command = new SqlCommand("TestTvpProc", connection);

käsku. CommandType = CommandType.StoredProcedure;

käsku. Parameters.Add(parameeter);

ühenduse loomisega. Open();

kasutamisel (SqlDataReaderi lugeja = käsk. ExecuteReader())

{

ajal (lugeja. Lugemine())

{

…;

}

}

}

}

Lahendus

See probleem on lahendatud järgmistes SQL Server koondvärskendustes.

SQL Server 2016 RTM koondvärskendus 5

SQL Server 2016 SP1 koondvärskendus 2

SQL Server 2014 hoolduspaketi Service Pack 2 koondvärskendus 4

Märkus See värskendus põhjustab õige "piirangurikkumise" tõrketeate tagastamise.

Teave SQL Server koondvärskenduste kohta

Iga uus koondvärskendus SQL Server sisaldab kõiki eelmise koondvärskenduse kiirparandusi ja turbeparandusi. Vaadake uusimaid SQL Server koondvärskendusi.

Uusim koondvärskendus SQL Server 2016 jaoks

Uusimad koondvärskendused SQL Server 2014 jaoks

Olek

Microsoft on kinnitanud, et see on jaotises „Rakenduskoht“ loetletud Microsofti toodete korral esinev probleem.

Viited

Siit leiate teavet microsofti tarkvaravärskenduste terminoloogia kohta.