KB4010162 – KORJAUS: Järjestelmän vahvistus tapahtuu, kun SQLCLR-toimintosarjasta kutsutaan TVP-argumentin sisältävää Transact-SQL-toimintosarjaa

Käytetään kohteeseen
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

Ongelman ilmenemistapa

Oletetaan, että sinulla on seuraavankaltainen tallennettu Transact-SQL-toimintosarja, joka käyttää taulukkoarvoista parametria (TVP), jolla on rajoite argumenttina:

luo tyyppi TestTvpType taulukoksi

(

id int perusavain, -- AINUTKERTAISET.ARVOT myös auttavat

data int

);

siirry

luontitoimintosarja TestTvpProc @tvp TestTvpType readonly

muodossa

aloita

valitse * kohteesta @tvp;

loppu;

siirry

Skenaariossa, jossa tämä toimintosarja kutsutaan SQLCLR:ään tallennetusta toimintosarjasta ja argumentin rajoitusta rikotaan, saatat saada virheellisesti järjestelmän vahvistuksen, vaikka odotettaisiin saavasi "rajoitusrikkomuksesta" kertova virhesanoma.

      

Seuraavassa on esimerkki SQLCLR-toimintosarjasta, joka tuottaa tallennetun toimintosarjan rajoitusrikkomuksen:

      

[SQL-toimintosarja]

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

Täytä TVP niin, että se aiheuttaa PERUSAVAIMEN VÄÄRINKÄYTÖS -virheen

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter-parametri = new SqlParameter();

-parametrin avulla. ParameterName = "@tvp";

-parametrin avulla. SqlDbType = System.Data.SqlDbType.Structured;

-parametrin avulla. Value = myDataTable;

SqlCommand-komento = new SqlCommand("TestTvpProc", connection);

-komento. CommandType = CommandType.StoredProcedure;

-komento. Parameters.Add(parametri);

yhteys. Open();

using (SqlDataReader reader = komento. ExecuteReader())

{

while (lukija. Read())

{

…;

}

}

}

}

Ratkaisu

Tämä ongelma on korjattu seuraavissa SQL Server kumulatiivisissa päivityksissä:

SQL Server 2016 RTM:n kumulatiivinen päivitys 5

SQL Server 2016 SP1:n kumulatiivinen päivitys 2

SQL Server 2014 Service Pack 2:n kumulatiivinen päivitys 4

Huomautus Tämä päivitys aiheuttaa oikean "rajoitusrikkomuksen" virhesanoman palauttamisen.

Tietoja SQL Serverin kumulatiivisista päivityksistä

Jokainen uusi kumulatiivinen SQL Server -päivitys sisältää kaikki edelliseen kumulatiiviseen päivitykseen sisältyvät hotfix-korjaukset ja tietoturvakorjaukset. Tutustu SQL Serverin uusimpiin kumulatiivisiin päivityksiin:

SQL Server 2016:n uusin kumulatiivinen päivitys

SQL Server 2014:n uusimmat kumulatiiviset päivitykset

Tila

Microsoft on vahvistanut tämän olevan ongelma niissä Microsoftin tuotteissa, jotka ovat listattuna Koskee seuraavia tuotteita -osiossa.

Viitteet

Lue lisää Microsoftin ohjelmistopäivitystensä kuvaamiseen käyttämästä sanastosta .