2012-01-16 5 views
0

У нас есть столбец char(16), который должен быть до тех пор, пока char(128). Как изменить тип данных в SQL Server 2008 R2, если таблица содержит более 100 000 строк? Возможно, это не имеет значения.Длина столбца столбца SQL-кода

Как дорого стоит эта операция?

+0

Вы не должны использовать SQL, если вы не знаете, как это сделать, или узнать (очень легко) как это сделать. – leppie

+4

Знаете ли вы, что столбец 'CHAR (128)' всегда будет ** использовать 128 символов (байтов) памяти? Он всегда будет использовать всю длину. Для длины такого размера я бы настоятельно рекомендовал вместо этого использовать 'VARCHAR (128)', который только когда-либо использует столько места, сколько символ хранится в нем ... –

+3

Re «насколько дорога эта операция?» Размер каждой строки данных расширяется на 116 байтов, которые необходимо вставлять в конце каждого расширяемого поля, расширяя размер данных на 11,5 МБ (около 1400 страниц). Вероятно, что практически все данные в таблице должны быть физически перемещены по страницам и экстентам. Как рекомендовано marc_s, использование столбцов переменной ширины может быть предпочтительным, если данные, хранящиеся в столбце, значительно различаются по всем записям, поскольку расширение емкости столбца не потребует по существу расширения каждой отдельной строки данных. – drf

ответ

3

Предполагая, что ваше имя таблицы является YourTable

ALTER TABLE YourTable ALTER COLUMN YourCharColumn CHAR(128) 

или в случае, если некоторые трудности

ALTER TABLE YourTable ADD NewChar char(128) NOT NULL CONSTRAINT df DEFAULT OldChar 
GO 
ALTER TABLE YourTable DROP CONSTRAINT df 
GO 
ALTER TABLE YourTable DROP COLUMN OldChar 
GO 
exec sp_rename('YourTable.NewChar', 'OldChar', 'COLUMN') 
+0

+1. Также может потребоваться «ALTER TABLE YourTable ALTER COLUMN NewChar CHAR (128) NULL' в качестве последнего шага, если столбец не должен в конечном итоге запрещать NULL. –

+0

@AndriyM Я думаю, что автор поймет, что если столбец является нулевым - тогда нет необходимости в ограничении по умолчанию и его отбрасывании –

+0

Почему, я думал, нет, я был уверен, что идея NOT NULL + DEFAULT должна была инициализировать новый столбец с помощью старые ценности, и я вполне согласен с этим. В противном случае вам придется «ОБНОВИТЬ ТЕМУ TET SET NewChar = OldChar». То есть, чтобы суммировать, если столбец изначально не равен NULL и должен оставаться таким, вы делаете все эти шаги во втором подходе, но если столбец должен быть NULL, вам нужно * дополнительно *, чтобы ALTER это было NULL. Или что мне не хватает? –

Смежные вопросы