Symptom
Anta att du lägger till en kolumn i en tabell i Microsoft SQL Server 2012 eller SQL Server 2014. När radstorleken är nära den maximala tillåtna storleken, d.v.s. 8 060 byte, kan det ta lång tid att lägga till.
Orsak
Problemet uppstår eftersom, när den totala radstorleken är nära den maximala tillåtna radstorleken, gör SQL Server en fullständig genomsökning av tabellen för att se till att lägga till en ny kolumn inte bryter mot dataintegriteten. Versionerna före SQL Server 2012 gör inte den här kontrollen och det gör att DDL (Data Definition Language) körs snabbare. Det här beteendet resulterar dock i fel för efterföljande åtgärder, till exempel raduppdatering eller krympning om radstorleken överskrider den tillåtna storleken.
Lösning
Den kumulativa uppdateringen introducerar en ny spårningsflagga 647 för bakåtkompatibilitetsbeteende.
Problemet åtgärdades först i följande kumulativa uppdatering av SQL Server.
Kumulativ uppdatering 5 för SQL Server 2014 /en-us/help/3011055
Kumulativ uppdatering 12 för SQL Server 2012 SP1 /en-us/help/2991533
Kumulativ uppdatering 2 för SQL Server 2012 SP2 /en-us/help/2983175
Om kumulativa uppdateringar för SQL Server
Varje ny kumulativ uppdatering för SQL Server innehåller alla snabbkorrigeringar och alla säkerhetskorrigeringar som ingick i den tidigare kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:
- Senaste kumulativa uppdateringen för SQL Server 2014
- Senaste kumulativa uppdateringen för SQL Server 2012 SP1
- Senaste kumulativa uppdateringen för SQL Server 2012 SP2
Mer information
Du kan aktivera spårningsflaggan 647 med hjälp av startparametern. Mer information finns i Startalternativ för Database Engine-tjänsten.
Du kan köra följande fråga (Ersätt <tabellnamnet> med det faktiska tabellnamnet) för att testa den specifika tabellen före åtgärden på ett produktionssystem och planera effekten av det här problemet. Om resultatet är större än 8 060 beror det här problemet på tabellen. Om du har tagit bort kolumner måste du dessutom ändra tabellen med alternativet Återskapa. Återskapa tabellen kan göra att frågan returnerar rätt resultat.
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 =1Du kan lägga till kolumner med variabel längd eller glesa kolumner när programmet ofta lägger till nya kolumner i tabellen. Det är en åtgärd för endast metadata, även om den totala storleken på alla kolumner överskrider 8 060 byte.
Status
Microsoft har bekräftat att detta är ett problem i de Microsoft-produkter som anges i avsnittet "Gäller".