Answers:
你不能。列顺序只是我们人类关心的“美容”问题-对于SQL Server,几乎总是绝对不相关的。
当您更改列顺序时,SQL Server Management Studio在后台执行的操作是使用新CREATE TABLE
命令从头开始重新创建表,从旧表中复制数据,然后将其删除。
没有SQL命令来定义列顺序。
INSERT
!
您必须按照希望它们返回的顺序显式列出这些字段,而不是在“默认”顺序中使用*。
原始查询:
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
/ copy drop
// rename 来完成,如komma8.komma1回答
或者您可以使用SQL Server Management Studio
- 在“ 对象资源管理器”中,右键单击包含要重新排序的列的表,然后单击“ 设计”(在2005 SP1版或更早版本中进行修改)
- 选择要重新排序的列名称左侧的框。(您可以通过按住键盘上的[shift]或[ctrl]键来选择多列。)
- 将列拖到表中的其他位置。
然后点击保存。此方法实际上删除并重新创建表,因此可能会发生一些错误。
如果为数据库和表启用了“ 更改跟踪”选项,则不应使用此方法。
如果已禁用,则应在“工具”菜单>“选项”>“设计器”中清除“ 防止保存需要重新创建表的更改”选项,否则将发生“不允许保存更改”错误。
在创建主键和外键时也可能会出现问题。
如果发生以上任何错误,保存将失败,这将使您保持原始列顺序。
This task cannot be performed using Transact-SQL statements.
文件中的「」陈述有误。我解释了作者,并要求他将其更改为“ This task is not supported using Transact-SQL statements.
”。大约一天前,作者同意,并且文件已修复。您可以关注我们在GitHub上进行的讨论。
您当然可以更改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
- - -
您可以通过创建一个新表,复制所有数据,删除旧表,然后重命名新表来替换旧表来做到这一点。
您还可以将新列添加到表中,逐列复制数据,删除旧列,然后重命名新列以匹配旧列。下面是一个简单的示例: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
SQL Server在内部构建脚本。它创建具有新更改的临时表,然后复制数据并删除当前表,然后从temp表中重新创建表插入。我从“ Generate Change script”选项ssms 2014中找到它。这样的脚本。从这里开始:如何使用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
如果表中有足够的列,则可以尝试此操作。首先创建一个具有首选列顺序的新表。
create table new as select column1,column2,column3,....columnN from table_name;
现在使用drop命令删除表格
drop table table_name;
现在将新创建的表重命名为您的旧表名称。
rename new to table_name;
现在选择表格,您已按照您的首选重新排列了列。
select * from table_name;
您可以通过以下步骤实现:
删除原始表的所有外键和主键。
重命名原始表。
使用CTAS按所需顺序创建原始表。
放下旧桌子。
将所有约束应用回原始表
如果要重新排序的列是最近创建的并且为空,则可以删除列并以正确的顺序重新添加。
这发生在我身上,手动扩展数据库以添加新功能,而我错过了一个列,而当我添加它时,顺序不正确。
在这里找不到合适的解决方案之后,我只是使用以下类型的命令对表进行了更正。
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname columntype;
注意:仅当要删除的列中没有数据时才这样做。
人们已经说过列顺序无关紧要。我经常使用SQL Server Management Studio的“生成脚本”来创建数据库模式的文本版本。为了有效地对这些脚本(git)进行版本控制并进行比较(WinMerge),必须使兼容数据库的输出相同,并且突出显示的差异才是真正的数据库差异。
列顺序很重要;但是只对某些人,而不是对所有人!
我想您想在特定位置添加一个新列。您可以通过将当前列向右移动来创建新列。
+---+---+---+
| A | B | C |
+---+---+---+
删除所有受影响的索引和外键引用。添加一个具有与最后一列完全相同的数据类型的新列,然后在其中复制数据。
+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
|___^
将第三列的数据类型更改为与上一列相同的类型,然后在其中复制数据。
+---+---+---+---+
| A | B | B | C |
+---+---+---+---+
|___^
相应地重命名列,重新创建删除的索引和外键引用。
+---+---+---+---+
| A | D | B | C |
+---+---+---+---+
更改第二列的数据类型。
用
SELECT * FROM TABLE1
显示表的默认列顺序。
如果要更改列的顺序。
指定要显示的列名
SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
试试这个命令:
alter table students modify age int(5) first;
这会将年龄位置更改为第一个位置。
示例:在表状态中,在field_price之后更改field_priority的位置。
ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;