2009-08-13 4 views
0

Когда вы создаете таблицу через скрипты, она просто перечисляет столбцы в порядке их создания. Это незначительная досада, но мне нравится какой-то метод безумия. Когда я позже добавлю столбец с ALTER TABLE, как мне заставить его отображаться в определенном месте при просмотре таблицы в интерактивных инструментах, таких как менеджер предприятия?Порядок отображения столбцов SQL Server

например:

Table Foo 
--------- 
FooID 
BarID 
Name 
Address 
Worth 

Я хочу

ALTER TABLE Foo 
ADD BazID INT NULL 

и BazID перечислены между BarID и Name когда я использую Management Studio.

ответ

3

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

Что представляет собой SQL Server Management Studio, это просто его собственная оптимизация отображения - вы можете изменить ее там, но в стандартном заявлении SQL Data Definition Language (DDL) нет понятия «порядок столбцов» - вы не можете использовать ALTER a чтобы переместить столбец в другую позицию.

Если вы изменили порядок отображения столбцов в SSMS, то что он будет делать в фоновом режиме, переименуйте старую таблицу во временное имя, создайте новую таблицу с столбцами в указанном вами порядке, а затем скопируйте данные. Вот почему изменение порядка столбцов на большой таблице может занять почти вечность - это не просто простая инструкция DDL, которая должна быть выполнена - это серьезное начинание.

Марк

+0

Спасибо. Это много дополнительной информации. Я не думаю, что мне когда-либо понадобится переупорядочивать столбцы настолько плохо, чтобы быть в порядке, когда это тащат мой стол так. –

+0

Добро пожаловать - рад помочь. –

0

Путь SQL Studio управление сервером и другие большие инструменты имени, как RedGate сделать это, чтобы сделать новую временную таблицу, скопировать информацию через, а затем удалить старую таблицу (ограничения & уникальных индексов первой), переименуйте таблицу temp в имя старой таблицы, затем повторно добавьте любые ограничения и индексы. Вы действительно не можете переупорядочить то, что уже есть.

Вот пример:

-- here's a sales table 
CREATE TABLE [dbo].[Sales](
    [SalesId] [int] IDENTITY(1,1) NOT NULL, 
    [Month] [int] NOT NULL, 
    [Year] [int] NOT NULL, 
    [InvoiceAmount] [decimal](15, 2) NOT NULL, 
    [SalesRepId] [int] NOT NULL, 
    [BranchId] [int] NOT NULL, 
CONSTRAINT [PK_Sales] PRIMARY KEY CLUSTERED 
(
    [SalesId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


--Here's the sales table adding a column called description between SalesId & Month 

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 
CREATE TABLE dbo.Tmp_Sales 
    (
    SalesId int NOT NULL IDENTITY (1, 1), 
    Description varchar(MAX) NULL, 
    Month int NOT NULL, 
    Year int NOT NULL, 
    InvoiceAmount decimal(15, 2) NOT NULL, 
    SalesRepId int NOT NULL, 
    BranchId int NOT NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
SET IDENTITY_INSERT dbo.Tmp_Sales ON 
GO 
IF EXISTS(SELECT * FROM dbo.Sales) 
    EXEC('INSERT INTO dbo.Tmp_Sales (SalesId, Month, Year, InvoiceAmount, SalesRepId, BranchId) 
     SELECT SalesId, Month, Year, InvoiceAmount, SalesRepId, BranchId FROM dbo.Sales WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_Sales OFF 
GO 
DROP TABLE dbo.Sales 
GO 
EXECUTE sp_rename N'dbo.Tmp_Sales', N'Sales', 'OBJECT' 
GO 
ALTER TABLE dbo.Sales ADD CONSTRAINT 
    PK_Sales PRIMARY KEY CLUSTERED 
    (
    SalesId 
    ) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

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