我可以在逻辑上对表中的列进行重新排序吗?


93

如果要向Microsoft SQL Server中的表添加列,是否可以控制该列在查询中的逻辑显示位置?

我不想弄乱磁盘上列的物理布局,但是我想在可能的情况下在逻辑上将列分组在一起,以便像SQL Server Management Studio这样的工具以一种方便的方式列出表的内容。

我知道我可以通过进入表的“设计”模式并拖动列的顺序来通过SQL Management Studio执行此操作,但是我希望能够在原始SQL中执行此操作,以便执行顺序从命令行编写脚本。


答案为时已晚,但请查看此链接。blog.sqlauthority.com/2013/03/11/…–
sqluser



而另一个相关的问题,关于是否重要stackoverflow.com/questions/6692021/...
蒂姆·阿贝尔

微软连接:用于更改列顺序的ALTER TABLE语法 -响应是像往常一样的巧克力茶壶类WONTFIX
Tim Abell,

Answers:


77

如果不创建新表,则无法以编程方式(即安全方式)执行此操作。

提交重新排序时,企业管理器的作用是创建一个新表,移动数据,然后删除旧表并将新表重命名为现有名称。

如果希望按特定的顺序/分组排列列而不改变其物理顺序,则可以创建一个所需的视图。


43

我认为这里每个人都缺少的是,尽管并不是每个人都必须处理在整个国家和世界范围内安装的同一软件系统的10、20或1000个实例……设计商业销售软件的我们中的每个人都必须这样做。结果,随着时间的推移,我们扩展了系统,通过在需要新功能时添加字段来扩展表,并且当确定这些字段确实属于现有表时,因此,经过十多年的扩展,增长,添加字段等到表格...。然后不得不使用这些表格,从设计到支持,有时甚至是挖掘原始数据/进行故障排除以调试新的功能错误....令人难以置信的是,没有所需的主要信息在前几个字段中看到

出于这个确切的原因,我经常希望我可以这样做。但是缺少精确执行SQL的功能,按照我想要的方式为新表构建创建脚本,向其写入插入,然后从现有表中删除所有现有约束,关系,键,索引等,然后重命名将“新”表恢复为旧名称,然后读取所有这些键,关系,索引等...。

不仅繁琐,耗时,而且……再过五年,将需要再次发生……。

它非常值得进行大量工作,但是重点是……这将不是我们最后一次需要这种能力,因为我们的系统将继续增长,扩展,并获得由需要/设计增加。

大多数开发人员从为单个公司或非常特定的硬盒市场提供服务的单一系统角度考虑。

市场上那些“现成的”但有进取心的设计师和开发领导者将总是不得不处理这个问题,一遍又一遍...... 这可以轻松地每周为我的公司节省十几个小时,而不必滚动或记住源数据表中“那个”字段的位置。


我们遇到了同样的问题,并创建了一个存储过程来自动执行此过程(重命名,创建新表,复制,重新创建所有外键,约束等)。您只需要传递表名和新的列顺序即可。如果这样做实际上可以每周为您的公司节省数十个小时的时间,则应花费时间编写类似的脚本。对于我们来说,只需要2-3天就能拥有一个稳定的脚本,我们通常使用该脚本来对列进行重新排序。它照顾了我们在SqlServer中使用的所有功能(例如,部分索引,索引视图等),并且仅包含约400个LOC。
安德烈亚斯

我不知道为什么他们不能以某种方式抽象出列布局。不必物理上重新排列列!PHD级别以及Sql Server中超出工程范围的数量确实令人惊讶。当您考虑到查询计划生成的复杂性时,统计信息,索引编制和任何人都还没有站起来,并说:“让我们只创建一个表示LOGICAL顺序的表。FieldID GuidOrderBy int。做完了 然后SELECT *使用SSMS或使用它。如果您是理想的DBA并不想使用它,请关闭它。非常沮丧。现在我的桌子已经足够大了,我再也无法蛮力了。
Simon_Weaver

我知道这是一个旧注释,但是当您更改表的架构并单击“发布”时,数据库项目中的Visual Studio会自动创建用于物理列重新排序的SQL脚本。
Muflix

5

如果我理解您的问题,您想影响现有查询中返回的第一,第二,第三列,对吧?

如果所有查询都使用SELECT * FROM TABLE- 编写,则它们将以SQL布局显示在输出中。

如果您的查询是用SELECT Field1, Field2 FROM TABLE- 编写的,则它们在SQL中的排列顺序无关紧要。


3

当Management Studio执行此操作时,它将创建一个临时表,复制所有内容,删除原始表并重命名该临时表。没有简单的等效T-SQL语句。

如果您不愿意这样做,则始终可以按所需顺序创建带有列的表格视图,并使用该视图?

编辑:殴打!


1

有一种方法,但这只是查询本身的暂时方法。例如,

假设您有5张桌子。表被称为T_Testing

名字,姓氏,电话号码,电子邮件和Member_ID

您希望它列出其ID,然后是“姓氏”,“名字”,“电话”和“电子邮件”。

您可以按照“选择”进行操作。

Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing

除此之外,如果由于某种原因,您只想让姓氏显示在名字之前,您也可以按照以下步骤进行操作:

Select LastName, *
From T_Testing

您唯一要确定的是,如果要使用Where或OrderBy,则需要将OrderBy或Where函数表示为Table.Column。

例:

Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc

我想这对我有所帮助,因为我需要自己做。


在此查询中,选择LastName,*从T_Testing中,您两次获得LastName。
sqluser 2015年

1
  1. 将现有表编写脚本到查询窗口。
  2. 针对测试数据库运行此脚本(删除Use语句)
  3. 使用SSMS进行所需的列更改
  4. 单击生成更改脚本(默认情况下,按钮栏上的最左侧和最底部的图标)
  5. 针对您的真实表使用此脚本

该脚本真正要做的就是创建具有所需列顺序的第二张表,将所有数据复制到其中,删除原始表,然后重命名第二张表以代替它。尽管确实需要部署脚本,但这确实节省了您自己编写代码的麻烦。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.