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

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

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

386823 次浏览

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

原始问题:

select * from foobar

报税表

foo bar
--- ---
1   2

现在写吧

select bar, foo from foobar


bar foo
--- ---
2   1

使用

SELECT * FROM TABLE1

它显示表的默认列顺序。

如果要更改列的顺序。

指定要相应显示的列名

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

你不能。列顺序只是我们人类所关心的一种“装饰性”的东西——对于 SQLServer 来说,它几乎总是完全无关紧要的。

当更改列顺序时,SQLServerManagementStudio 在后台执行的操作是使用新的 CREATE TABLE命令从头重新创建表,从旧表复制数据,然后删除它。

没有用于定义列顺序的 SQL 命令。

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

这么说吧:

  • 根据 SQL 标准,表中的列不是“有序”的
  • 因此,select *不强制按特定顺序返回列
  • 通常,每个 RDBMS 都有一种“默认”顺序(通常是列添加到表中的顺序,在 create table' or in thealter 表 add‘语句中
  • 因此,如果您依赖于列的顺序(因为您正在使用查询的结果从列的位置拼凑一些其他的数据结构) ,显式地按照您想要的顺序列出列。

当然,您可以更改 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

根据 https://learn.microsoft.com/en-us/sql/relational-databases/tables/change-column-order-in-a-table

使用 Transact-SQL 语句不支持此任务。

嗯,可以这样做,使用 create/copy/drop/rename,正如 来吧,来吧所回答的那样

或者可以使用 SQLServerManagementStudio

  1. 对象资源管理器中,右键单击包含要重新排序的列的表,然后单击 设计(编辑。2005SP1或以上)
  2. 选择要重新排序的列名左侧的框。(可以通过保持[ shift ]或 键盘上的[ ctrl ]键。)
  3. 将列拖动到表中的其他位置。

这个方法实际上会删除并重新创建表,因此可能会出现一些错误。

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

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

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

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

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

到最后,您根本不能在 MSSQL 中做到这一点。我最近使用一个从查找表读取的存储过程在运行(应用程序启动)时创建了表。当我创建了一个视图,将这些表与我之前手动创建的另一个表(同样的模式,带有数据)结合起来时,它失败了——仅仅是因为我对视图使用了“ Select * UNION Select *”。同时,如果我只使用通过存储过程创建的那些,那么我就成功了。

总之: 如果有任何应用程序依赖于列的顺序,那么它真的不是一个好的编程,而且肯定会在将来造成问题。列应该“感觉”可以放在任何地方,并用于任何数据进程(INSERT、 UPDATE、 SELECT)。

你可以使用索引。.建立索引后,如果从 XXXX 中选择 * ,结果应该与索引一致,但只能是结果集。.不是表的结构

您可以使用 SQL 查询来更改这一点。

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

你可以通过以下步骤实现:

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

  2. 重命名原始表。

  3. 使用 CTAS 按您希望的顺序创建原始表。

  4. 放下旧桌子。

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

如果您的表有足够的列,那么您可以尝试这样做。首先创建一个具有首选列顺序的新表。

    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;

首先修改表名修改列名 int (5) ; 将把纵队带到第一位 在(tablename)之后更改表名修改列名 int (5) ;

在 SQLServerManagementStudio 中:

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

  • 取消选择“防止保存需要重新创建表的更改”。

然后:

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

SQLServerManagement 工作室将删除该表并使用数据重新创建它。

示例: 在表状态中,在 field _ price 之后更改 field _ 堆栈的位置。

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

Sql 服务器在内部构建脚本。它使用新的更改创建一个临时表,然后复制数据并删除当前表,然后从临时表重新创建表插入。我发现它从“生成更改脚本”选项 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

如果要重新排序的列最近已经创建并为空,则可以按正确的顺序删除和重新添加这些列。

这种情况发生在我身上,我手动扩展数据库来添加新的功能,我错过了一个列,当我添加它时,顺序是不正确的。

在这里找不到适当的解决方案之后,我只是使用以下类型的命令更正了表。

ALTER TABLE  tablename  DROP COLUMN  columnname;
ALTER TABLE  tablename  ADD columnname columntype;

注意: 只有在要删除的列中没有数据时才这样做。

人们说,列顺序并不重要。我经常使用 SQLServerManagementStudio“生成脚本”来创建数据库模式的文本版本。为了有效地对这些脚本进行版本控制(git)并对它们进行比较(WinMerge) ,兼容数据库的输出必须相同,并且突出显示的差异是真正的数据库差异。

列的顺序确实重要,但只是对一些人,不是每个人!

在 SQLServerManagementStudio 中:

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

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

现在你可以重新订餐了。

为了获得特定的列顺序,您需要按照您希望的顺序逐列选择列。 选择顺序规定了列在输出中的排序方式。

试试这个命令:

alter table students modify age int(5) first;

这将把年龄的位置改为第一个位置。

我在 Oracle DB 上就是这么做的:

select column1, column2, t.* from table t

如果尚未向表中添加任何数据,则有一种方法可以移动列。 试试这个:

  1. 在 SSMS 中,单击 工具 > 选择 > 设计师 > 表和数据库设计器 > 取消选中 防止保存需要重新创建表的更改旁边的框 > 单击 好的
  2. 在对象树中,右键单击您的表,并在 栏名列的 左边的瘦列中选择 设计 > ,您可以单击并将列拖动到您想要的任何位置。当您完成后,只需转到 差不多的设计选项卡和 SSMS 将询问您是否要保存您的更改,单击 好的

可选项: 3. 重新启用步骤1中选项的复选框以重新保护表。

希望这对谁有帮助!

这要归功于微软: Https://learn.microsoft.com/en-us/troubleshoot/sql/ssms/error-when-you-save-table#more-information

不确定是否仍然相关,但 SSMS 可以为此生成更改脚本。

  1. 在设计器视图中对表重新排序(拖动列)
  2. 点击“生成更改脚本”

enter image description here

生成的脚本包含执行以下操作的脚本:

  1. 创建一个临时表
  2. 将原始表中的约束、关系和触发器添加到临时表中
  3. 放下原来的桌子
  4. 将临时表重命名为原始表名