Что произойдет, если я изменю столбец с nvarchar(2) на nvarchar(10) или столбец с char(2) на nvarchar(10). Блокирует ли это, реорганизует ли таблицу или работает без каких-либо последствий или простоев?
Я пытался найти, что произойдет, если я изменю столбец, но ничего не нашел. Это большая таблица с одним или двумя столбцами, которые нужно изменить. Речь идет о MS SQL Server 2008 R2.
решение1
Самый простой способ выяснить это — использовать тестовую среду, создать фиктивную таблицу и несколько фиктивных записей, применить изменения, о которых идет речь, а затем отследить действия с помощью профайлера.
ИЛИ Измените таблицу в таблице, разработанной в SSMS, а затем используйте кнопку «Сгенерировать сценарий изменения». Когда я изменяю свой столбец с Char(2) на NVARCHAR(10). Сгенерированный сценарий изменения выдает следующее:
CREATE TABLE dbo.Tmp_t2
(
id int NULL,
c1 nvarchar(50) NULL,
c2 nvarchar(2) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_t2 SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.t2)
EXEC('INSERT INTO dbo.Tmp_t2 (id, c1, c2)
SELECT id, CONVERT(nvarchar(50), c1), c2 FROM dbo.t2 WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.t2
GO
EXECUTE sp_rename N'dbo.Tmp_t2', N't2', 'OBJECT'
GO
COMMIT
решение2
Если вы используете команды ALTER, то они создадут другую таблицу, скопируют существующие данные в новую таблицу, удалит старую таблицу по завершении, а затем переименует новую таблицу, используя старое имя таблицы. Я не думаю, что это лучшая практика делать во время работы базы данных, но есть методы работы с производственными данными.
http://www.sqlmag.com/article/tsql3/resizing-a-column-in-a-large-table.aspx
решение3
Никакие другие операции (например, вставка, обновление, удаление) не могут быть выполнены, когда тип данных столбца таблицы изменяется, вся таблица будет заблокирована. Также нельзя выбрать с помощью NOLOCK.