Как добавить столбцы между полями или изменить существующие в SQL? - PullRequest
2 голосов
/ 17 августа 2011

Кто-нибудь знает, как добавить столбец в таблицу в SQL 2005/2008 между конкретными полями или после определенного поля?А как насчет изменения позиции в существующих столбцах?

Пример:

AHADRS, AHCITY, AHZIPC

Я хотел бы добавить состояние между AHCITY и AHZIPC

Этоэто то, что я пробовал до сих пор, но они не работают

ALTER TABLE AHASNF00 ADD AHZIPC varchar(max) AFTER AHCITY
ALTER TABLE AHASNF00 ADD AHZIPC varchar(max) FIRST AHZIPC

Любая помощь будет очень признателен, спасибо.

Ответы [ 3 ]

6 голосов
/ 17 августа 2011

SqlServer не имеет понятия «позиция», когда речь идет о хранении столбцов.

Если вам нужен другой порядок столбцов, измените позицию в своем выражении select.

4 голосов
/ 17 августа 2011

Обычно это решается созданием временной таблицы с временным именем, в которой столбцы расположены в том порядке, в каком вы хотите их иметь.Затем данные копируются из одной текущей таблицы в другую, после чего старая таблица уничтожается, а временная переименовывается обратно в исходную.

Это, конечно, все должно быть согласовано с удалением и чтениемссылки на первичные и внешние ключи.

Например, это сценарий изменений, который 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
2 голосов
/ 17 августа 2011

К сожалению, я не верю, что есть простой способ сделать это с помощью T-SQL. Вам нужно будет сделать что-то вроде создания новой таблицы с порядком, в котором вы хотите столбцы, вставить данные из старой таблицы в новую таблицу, удалить старую таблицу, переименовать новую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...