Príznaky
Predpokladajme, že pridáte stĺpec do tabuľky v Microsoft SQL Server 2012 alebo SQL Server 2014. Keď sa veľkosť riadka blíži k maximálnej povolenej veľkosti, ktorá je 8 060 bajtov, Operácia pridania môže trvať dlho.
Príčina
Problém sa vyskytuje, pretože keď je celková veľkosť riadka v blízkosti maximálnej povolenej veľkosti riadka, SQL Server vykoná úplnú kontrolu tabuľky, aby sa ubezpečil, že pridanie nového stĺpca neporušuje integritu údajov. Verzie pred SQL Server 2012 nerobia túto kontrolu a vďaka čomu je jazyk DDL (Data Definition Language) rýchlejší. Toto správanie však vedie k zlyhaniu následných operácií, ako je napríklad Riadková aktualizácia alebo zmenšenie, ak veľkosť riadka prekračuje povolenú veľkosť.
Riešenie
Kumulatívna aktualizácia predstavuje nový príznak sledovania 647 pre spätnú kompatibilitu správania. Tento problém bol najskôr vyriešený v nasledujúcej kumulatívnej aktualizácii SQL servera.
Kumulatívna aktualizácia 5 pre SQL Server 2014 /en-us/help/3011055
Kumulatívna aktualizácia 12 pre SQL Server 2012 SP1 /en-us/help/2991533
Kumulatívna aktualizácia 2 pre SQL Server 2012 SP2 /en-us/help/2983175
Každá nová Kumulatívna aktualizácia pre SQL Server obsahuje všetky rýchlych opráv a všetky opravy zabezpečenia, ktoré boli súčasťou predchádzajúcej kumulatívnej aktualizácie. Pozrite si najnovšie kumulatívne aktualizácie pre SQL Server:
Ďalšie informácie
-
Pomocou parametra pri spustení môžete zapnúť príznak sledovania 647. Ďalšie informácie nájdete v téme možnosti spustenia služby databázový stroj.
-
Môžete spustiť nasledujúci dotaz (nahraďte <názov tabuľky> s aktuálnym názvom tabuľky), ak chcete otestovať konkrétnu tabuľku pred operáciou vo výrobnom systéme a naplánovať efekt tohto problému. Ak je výsledok väčší ako 8 060, na tabuľku sa vzťahuje tento problém. Ak ste však zrušili stĺpce, budete musieť zmeniť tabuľku pomocou možnosti znova zostaviť. Opätovné vytvorenie tabuľky môže dotaz vrátiť správne výsledky.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1
-
Môžete zvážiť pridanie stĺpcov s variabilnou dĺžkou alebo riedkych stĺpcov, keď aplikácia často pridáva do tabuľky nové stĺpce. Je to operácia iba s metaúdajmi, aj v prípade, že celková veľkosť všetkých stĺpcov presahuje 8 060 bajtov.
Stav
Spoločnosť Microsoft potvrdzuje, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v tomto článku v časti Informácie v tomto článku sa týkajú nasledujúcich produktov.