2009-08-13 117 views
0

當您通過腳本創建表時,它似乎只是按創建順序列出列。這是一個小小的煩惱,但我喜歡某種瘋狂的方法。當我後來添加一列ALTER TABLE時,如何在交互式工具(如企業管理器)中查看錶格時將其顯示在特定位置?SQL Server列顯示順序

例如:

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

我想

ALTER TABLE Foo 
ADD BazID INT NULL 

,並BarID,當我使用Management Studio Name之間上市BazID

回答

3

你不能這麼做 - 一個SQL Server表真的不知道任何關於列的順序 - 元組代數中沒有關係數據庫系統的基礎。

什麼SQL Server Management Studio向您顯示的只是它自己的顯示「優化」 - 您可以在那裏更改它,但標準的SQL數據定義語言(DDL)語句沒有「列順序」的概念 - 您不能ALTER a表將列移動到不同的位置。

如果在SSMS中更改列顯示順序,它將在後臺執行的操作是將舊錶重命名爲臨時名稱,按照指定順序創建具有列的新表,然後複製數據。這就是爲什麼在大表上修改列順序幾乎可以永久消失的原因 - 這不僅僅是一個簡單的小DDL語句被執行 - 這是一項重大任務。

馬克

+0

謝謝。這是很多額外的信息。我不認爲我會永遠需要對列重新排序,以至於它可以像我這樣洗牌。 – 2009-08-13 19:23:53

+0

不客氣 - 很高興有所幫助。 – 2009-08-13 19:25:20

0

的方式在SQL Server Management Studio中和其他大牌工具,如展鵬做到這一點,是讓一個新的臨時表,在複製的信息,然後刪除舊錶(約束&唯一索引第一),將臨時表重命名爲舊錶名,然後重新添加任何約束和索引。你真的不能重新排序已經存在的東西。

下面是一個例子:

-- 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