如何在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
- 在对象资源pipe理器中 ,右键单击要重新sorting的列的表格,然后单击devise (在版本2005 SP1或更低版本中修改)
- select要重新sorting的列名称左侧的框。 (您可以通过按住键盘上的[shift]或[ctrl]键来select多个列。)
- 将列拖到表格中的另一个位置。
然后点击保存。 这个方法实际上是删除并重新创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`;
您可以通过以下步骤来实现它:
-
删除原始表的所有外键和主键。
-
重命名原始表。
-
使用CTAS以您想要的顺序创build原始表格。
-
放下旧桌子。
-
将所有约束应用回原始表
使用
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`;