SQL Server列显示顺序

时间:2009-08-13 19:05:28

标签: sql-server sql-server-2008

当您通过脚本创建表时,它似乎只是按创建顺序列出列。这是一个小小的烦恼,但我喜欢疯狂的某种方法。当我稍后添加ALTER TABLE列时,如何在企业管理器等交互式工具中查看表时,如何将其显示在特定位置?

例如:

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

我想

ALTER TABLE Foo  
ADD BazID INT NULL 

并在使用Management Studio时在BazIDBarID之间列出Name

2 个答案:

答案 0 :(得分:3)

你不能那样做 - 一个SQL Server表实际上对列的顺序一无所知 - 元组代数中没有关系数据库系统基础的命令。

SQL Server Management Studio显示的只是它自己的显示“优化” - 你可以在那里进行更改,但标准的SQL数据定义语言(DDL)语句没有“列顺序”的概念 - 你不能改变一个表将列移动到其他位置。

如果您更改SSMS中的列显示顺序,它在后台执行的操作是将旧表重命名为临时名称,使用您指定的顺序创建包含列的新表,然后复制数据。这就是为什么修改大型表上的列顺序几乎可以永远 - 这不仅仅是一个简单的小DDL语句要执行 - 这是一项重大任务。

马克

答案 1 :(得分:0)

sql server管理工作室和像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