Обычно это решается созданием временной таблицы с временным именем, в которой столбцы расположены в том порядке, в каком вы хотите их иметь.Затем данные копируются из одной текущей таблицы в другую, после чего старая таблица уничтожается, а временная переименовывается обратно в исходную.
Это, конечно, все должно быть согласовано с удалением и чтениемссылки на первичные и внешние ключи.
Например, это сценарий изменений, который SQL Server Management Studio генерирует, когда я пытаюсь добавить столбец в середине других столбцов в реальной таблице примеров с именем «Term».
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Term
DROP CONSTRAINT FK_Term_TermUnit
GO
ALTER TABLE dbo.TermUnit SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Term
(
Id int NOT NULL IDENTITY (1, 1),
Label varchar(50) NOT NULL,
TermUnitId int NOT NULL,
NewColumnInTheMiddle bit NULL,
UnitCount int NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Term SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_Term ON
GO
IF EXISTS(SELECT * FROM dbo.Term)
EXEC('INSERT INTO dbo.Tmp_Term (Id, Label, TermUnitId, UnitCount)
SELECT Id, Label, TermUnitId, UnitCount FROM dbo.Term WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Term OFF
GO
ALTER TABLE dbo.TreasuryIndexRate
DROP CONSTRAINT FK_TreasuryIndexRate_Term
GO
ALTER TABLE dbo.TreasuryIndexField
DROP CONSTRAINT FK_TreasuryIndexField_Term
GO
DROP TABLE dbo.Term
GO
EXECUTE sp_rename N'dbo.Tmp_Term', N'Term', 'OBJECT'
GO
ALTER TABLE dbo.Term ADD CONSTRAINT
PK_Term PRIMARY KEY CLUSTERED
(
Id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE dbo.Term ADD CONSTRAINT
FK_Term_TermUnit FOREIGN KEY
(
TermUnitId
) REFERENCES dbo.TermUnit
(
Id
) ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TreasuryIndexField ADD CONSTRAINT
FK_TreasuryIndexField_Term FOREIGN KEY
(
TermId
) REFERENCES dbo.Term
(
Id
) ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
ALTER TABLE dbo.TreasuryIndexField SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TreasuryIndexRate ADD CONSTRAINT
FK_TreasuryIndexRate_Term FOREIGN KEY
(
TermId
) REFERENCES dbo.Term
(
Id
) ON UPDATE NO ACTION
ON DELETE NO ACTION
GO
ALTER TABLE dbo.TreasuryIndexRate SET (LOCK_ESCALATION = TABLE)
GO
COMMIT