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

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

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

你不能。 列顺序只是我们人类关心的“外观”事物 – 对于SQL Server来说,它几乎总是毫不相干的。

在更改列顺序时,SQL Server Management Studio在后台执行的操作是使用新的CREATE TABLE命令重新CREATE TABLE表,然后将其从旧表中复制,然后将其删除。

没有SQL命令来定义列顺序。

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

原始查询:

 select * from foobar 

回报

 foo bar --- --- 1 2 

现在写

 select bar, foo from foobar bar foo --- --- 2 1 

按照http://msdn.microsoft.com/en-us/library/aa337556.aspx

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

那么,它可以使用create /复制/ drop /重命名,由komma8.komma1回答

或者你可以使用SQL Server Management Studio

  1. 对象资源pipe理器中 ,右键单击要重新sorting的列的表格,然后单击devise (在版本2005 SP1或更低版本中修改)
  2. select要重新sorting的列名称左侧的框。 (您可以通过按住键盘上的[shift]或[ctrl]键来select多个列。)
  3. 将列拖到表格中的另一个位置。

然后点击保存。 这个方法实际上是删除并重新创build表,所以可能会出现一些错误。

如果对数据库和表启用了“ 更改跟踪”选项,则不应使用此方法。

如果禁用,则应在工具菜单>选项>devise器中清除需要重新创build表防止保存更改 ,否则将出现“不允许保存更改”错误。

  • 禁用防止保存需要表重新创build选项的更改,这是由Microsoft强烈build议的,因为它会导致在重新创build表时删除现有的更改跟踪信息,因此, 如果“更改跟踪”为启用!

在创build主键和外键时也可能出现问题。

如果发生上述任何错误,保存失败将使您保留原始的列顺序。

这与在查询结果中sortinglogging的问题类似,通常没有人喜欢正式的正确答案;-)

所以在这里:

  • 按照SQL标准,表中的列不是“sorting”的
  • 因此, select *不会强制以特定顺序返回列
  • 通常,每个RDBMS都有一种“默认”顺序(通常是列添加到表中的顺序,无论是在create table' or in the alter table add语句中
  • 因此,如果您依赖列的顺序(因为您正在使用查询的结果从列的位置挖掘其他数据结构),请按照所需顺序显式列出列。

你当然可以在sql语句中改变列的顺序。 但是,如果你想抽象表的物理列顺序,你可以创build一个视图。 即

 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; abc - - - select * from vw_myTable cab - - - 

你可以通过创build一个新表来完成,复制所有的数据,删除旧的表,然后重命名新的表来replace旧的表。

您也可以在表中添加新列,按列数据复制列,删除旧列,然后重新命名新列以匹配旧列。 下面是一个简单的例子: 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 

在SQLServer Management Studio中:

工具 – >选项 – >devise师 – >表和数据库devise师

  • 取消select“阻止保存需要重新创build表的更改”。

然后:

  • 右键单击要重新排列列的表。
  • 点击“devise”。
  • 将列拖动到所需的顺序。
  • 最后点击保存。

SQLServer Management Studio将删除表并使用数据重新创build它。

如果你的表有足够的列,那么你可以试试这个。 首先创build一个具有首选列顺序的新表。

  create table new as select column1,column2,column3,....columnN from table_name; 

现在使用drop命令删除表

  drop table table_name; 

现在将新创build的表重命名为旧的表名。

  rename new to table_name; 

现在select表格,您可以根据您的喜好重新安排您的列。

  select * from table_name; 

Sql服务器在内部构build脚本。 它会创build一个包含新更改的临时表,并复制数据并删除当前表,然后从临时表中重新创build表插入。 我从“生成更改脚本”选项ssms 2014中find它。像这样的脚本。 从这里:如何使用SQL查询更改表中的列顺序

 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_emps ( id int NULL, ename varchar(20) NULL ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE) GO IF EXISTS(SELECT * FROM dbo.emps) EXEC('INSERT INTO dbo.Tmp_emps (id, ename) SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)') GO DROP TABLE dbo.emps GO EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' GO COMMIT 

在一天结束的时候,你根本无法在MS SQL中做到这一点。 我最近使用从查找表中读取的存储过程创build了表(应用程序启动)。 当我创build一个视图,将这些视图与另一个我手动创build的较早的视图(相同的模式,数据)组合在一起的视图时,它失败了 – 仅仅因为我正在使用'Select * UNION Select *'视图。 同时,如果我只用那些通过存储过程创build的,我就成功了。

总而言之,如果有任何依赖于列顺序的应用程序,那么编程确实不是很好,将来肯定会产生问题。 列应该“感觉”自由,可以在任何地方用于任何数据处理(INSERT,UPDATE,SELECT)。

你可以使用索引。索引后,如果select * from XXXX的结果应该是按照索引,但是只有结果集。不是struct的表结构

你可以使用SQL查询来改变它。 这里是sql查询来改变列的顺序。

 ALTER TABLE table name CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`; 

您可以通过以下步骤来实现它:

  1. 删除原始表的所有外键和主键。

  2. 重命名原始表。

  3. 使用CTAS以您想要的顺序创build原始表格。

  4. 放下旧桌子。

  5. 将所有约束应用回原始表

使用

 SELECT * FROM TABLE1 

其中显示表格的默认列顺序。

如果你想改变列的顺序。

指定相应的列名称来显示

 SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1 

alter table name修改columnname int(5)first; (tablename)后修改列名int(5);

示例:在表状态中更改field_price后的field_priority的位置。

 ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;