Symptom
Anta att du lägger till en kolumn i en tabell i Microsoft SQL Server 2012 eller SQL Server 2014. När rad storleken är nära den högsta tillåtna storleken som är 8 060 byte kan det ta lång tid att lägga till en åtgärd.
Orsak
Problemet uppstår eftersom den totala storleken på raden är nära den högsta tillåtna rad storleken gör SQL Server en fullständig genomsökning av tabellen för att se till att en ny kolumn inte bryter mot data integriteten. De här versionerna före SQL Server 2012 gör inte den här kontrollen och gör att DDL (Data Definition Language) körs snabbare. Det här beteendet gör att det inte går att utföra efterföljande operationer, till exempel rad uppdatering eller krympning om rad storleken överskrider den tillåtna storleken.
Lösning
Den kumulativa uppdateringen introducerar en ny spårnings flagga 647 för bakåtkompatibilitet. Problemet är först åtgärdat i den kumulativa uppdateringen 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
Varje ny kumulativ uppdatering för SQL Server innehåller alla snabb korrigeringar och alla säkerhets korrigeringar som ingick i den föregående kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:
Mer information
-
Du kan aktivera spårnings flaggan 647 med hjälp av start parametern. Mer information finns i Start alternativ för tjänsten databas motor.
-
Du kan köra följande fråga (Ersätt <tabell namn> med det faktiska tabell namnet) för att testa den aktuella tabellen före operationen på ett produktions system och planera effekten av detta problem. Om resultatet är större än 8 060 beror problemet på tabellen. Om du har tappat kolumnerna måste du dessutom ändra tabellen med alternativet återskapa. Återskapa tabellen kan göra så 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 =1
-
Du kan överväga att lägga till kolumner för variabel längd eller glesa kolumner när programmet ofta lägger till nya kolumner i tabellen. Det är endast en metadata-åtgärd även om total storleken för alla kolumner är större än 8 060 byte.
Status
Microsoft har bekräftat att det här är ett problem i Microsoft-produkterna som nämns i "gäller".