如何在sql server 2005中使用sql查询更改表中的列顺序?

Him*_*dri 95 sql sql-server-2005

如何在SQL Server 2005中使用SQL查询更改表中的列顺序?

我想使用SQL查询重新排列表中的列顺序.

mar*_*c_s 96

你不能.列顺序只是我们人类关心的"整容"事物 - 对于SQL Server来说,它几乎总是绝对无关紧要.

当您更改列顺序时,SQL Server Management Studio在后台执行的操作是使用新CREATE TABLE命令从头开始重新创建表,从旧表复制数据,然后删除它.

没有用于定义列排序的SQL命令.

  • @marc_s支持列顺序没有充分的理由.即使它只是视觉.当您进行"SELECT*"时,它可以更容易地查看具有给定列顺序的表中的数据.我是一名开发人员,一直都在进行这类查询.您可以通过良好的预定义列顺序节省时间.当然,从任何其他角度来看,没有任何意义:没有什么应该依赖于列顺序.顺便说一句,有一个ORDINAL_POSITION列,你查询"INFORMATION_SCHEMA.COLUMNS".我不知道这意味着什么......但它必须与此有关. (59认同)
  • 例如,在不指定列名的情况下使用INSERT INTO时,列顺序是相关的.另一个例子是ORDER BY列索引而不是列名.两者显然都不是推荐的做法,但SQL Server允许它,所以有人可能在某处使用它,可能在更改列顺序时破坏T-SQL代码. (17认同)
  • @Carvelis:你应该**永远不要**使用`INSERT`而不明确指定你的列! (9认同)
  • 即使过了十年,这个答案仍然让我震惊。存在标准和最佳实践这一事实并没有改变这样一个事实:列排序是大多数开发人员一直使用的实用工具。我们不应该使用 Select * 或任何快捷方式来明确声明,但是当我们进行表设计或只是简单测试、提取数据以进行开发或其他任何操作时,让数据按有意义的顺序排列会很有帮助以节省时间和避免混乱。另外,每个 GUI 软件都会按该顺序向您显示该列,这有助于您的眼睛更快地找到信息。 (5认同)
  • 不,ni SQL Server没有这样的东西 - 并且不应该在任何真正的RBDMS中 - 列顺序不是与SQL表相关的概念 (4认同)
  • 列的列顺序绝对是**不**只是“装饰性”@marc_s,或“仅视觉”@JotaBe。该顺序可以直接影响性能。我有一个关于“SQL Server 内部:表结构”的讲座,在其中一个演示中我创建了两个数据库 > 执行相同的脚本,从创建表开始 > 结果是一个 DB 的大小是另一个 DB 的两倍,并且除了更改表`:-)`中一列的顺序之外,我执行了完全相同的脚本。我也多次在 MSDN 论坛中给出了一个完整的例子。 (3认同)
  • @marc_s:绝对,但我通常不是唯一一个在项目上工作的人.我见过很多人都使用过这种代码的项目. (2认同)
  • 从现有数据库生成器使用实体框架代码优先时,列顺序是相关的(不仅是装饰性的)。当用于复合主键的列的顺序不正确时(尽管键被正确定义为外键),则您无法实例化数据库上下文 - 验证失败。所以有时有很好的理由和强烈的需求来修复列 odrer。 (2认同)
  • 使用 BULK INSERT 时,列顺序是相关的。 (2认同)
  • 列的顺序对于大表也很重要.从MS SQL Server 2012内部书籍:对于可变长度列,NULL不占用行的可变长度数据部分中的任何空格.但是,如清单6-7所示,每个可变长度列仍然存在一个2字节的列偏移条目,因此您不能说它们根本不占用任何空间.但是,如果零长度值存储在可变长度数据列列表的末尾,则SQL Server不会存储有关它的任何信息,也不会在列偏移数组中包含2个字节. (2认同)

lex*_*exu 26

您必须按照希望返回的顺序显式列出字段,而不是使用*作为"默认"顺序.

原始查询:

select * from foobar
Run Code Online (Sandbox Code Playgroud)

回报

foo bar
--- ---
  1   2
Run Code Online (Sandbox Code Playgroud)

现在写

select bar, foo from foobar

bar foo
--- ---
  2   1
Run Code Online (Sandbox Code Playgroud)


rob*_*tik 21

根据http://msdn.microsoft.com/en-us/library/aa337556.aspx

无法使用Transact-SQL语句执行此任务.

好吧,它可以是,使用create/ copy/drop/ rename,由komma8.komma1回答

或者您可以使用SQL Server Management Studio

  1. 对象资源管理器中,右键单击包含要重新排序的列的表,然后单击" 设计"(在2005 SP1或更早版本中修改)
  2. 选择要重新排序的列名称左侧的框.(您可以通过按住键盘上的[shift]或[ctrl]键来选择多个列.)
  3. 将列拖动到表中的其他位置.

然后单击"保存" 此方法实际上会删除并重新创建表,因此可能会发生一些错误.

如果为数据库和表启用了" 更改跟踪"选项,则不应使用此方法.

如果禁用,则应在"工具"菜单>"选项">"设计器"中清除" 需要重新创建表格防止保存更改"选项,否则将出现"不允许保存更改"错误.

  • Microsoft强烈建议禁用禁止保存需要重新创建表选项的保存更改,因为它会导致在重新创建表时删除现有的更改跟踪信息,因此如果更改跟踪,则永远不应禁用此选项.启用!

在创建主键和外键时也可能出现问题.

如果出现上述任何错误,保存将失败,从而使您保留原始列顺序.


Tho*_*ten 12

这类似于在查询结果中排序记录的问题..通常没有人喜欢正式的正确答案;-)

所以这里:

  • 根据SQL标准,表中的列不是"有序"的
  • 因此,a select *不会强制按特定顺序返回列
  • 通常,每个RDBMS都有一种"默认"顺序(通常是列添加到表中的顺序,在create table' or in thealter table中添加`语句
  • 因此,如果您依赖列的顺序(因为您使用查询的结果来从列的位置对其他数据结构进行包装),请按所需顺序显式列出列.


mev*_*ven 11

您当然可以在sql语句中更改列的顺序.但是,如果要抽象表的物理列顺序,则可以创建视图.即

CREATE TABLE myTable(
    a int NULL,
    b varchar(50) NULL,
    c datetime NULL
);


CREATE VIEW vw_myTable
AS
SELECT c, a, b
  FROM myTable;

select * from myTable;
a  b  c
-  -  -

select * from vw_myTable
c  a  b
-  -  -
Run Code Online (Sandbox Code Playgroud)


kom*_*ma1 6

您可以通过创建新表,复制所有数据,删除旧表,然后重命名新表以替换旧表来完成.

您还可以向表中添加新列,按列数据复制列,删除旧列,然后重命名新列以匹配旧列.下面是一个简单的例子:http: //sqlfiddle.com/#!3/67af4/1

CREATE TABLE TestTable (
    Column1 INT,
    Column2 VARCHAR(255)
);
GO

insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO

select * from TestTable;
GO

ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO

update TestTable 
set Column1_NEW = Column1, 
    Column2_NEW = Column2;
GO

ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO

sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO

select * from TestTable;
GO
Run Code Online (Sandbox Code Playgroud)


小智 6

在SQLServer Management Studio中:

工具 - >选项 - >设计师 - >表和数据库设计师

  • 取消选中"禁止保存需要重新创建表的更改".

然后:

  • 右键单击要为其重新排序列的表.
  • 点击"设计".
  • 将列拖动到所需的顺序.
  • 最后,单击"保存".

SQLServer Management studio将删除表并使用数据重新创建它.


小智 6

在 SQLServer 管理工作室中:

Tools-> Options-> Designers->Table and Database Designers

取消选择Prevent saving changes that require table re-creation

现在您可以对表重新排序。