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

Posted

技术标签:

【中文标题】我可以对表中的列进行逻辑重新排序吗?【英文标题】:Can I logically reorder columns in a table? 【发布时间】:2010-09-05 07:43:39 【问题描述】:

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

我不想弄乱磁盘上列的物理布局,但我想尽可能在​​逻辑上将列分组在一起,以便 SQL Server Management Studio 等工具以方便的方式列出表的内容。

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

【问题讨论】:

答案为时已晚,但请查看此链接。 blog.sqlauthority.com/2013/03/11/… 另见***.com/questions/4402312/…和***.com/questions/5327545/… 更多相关内容:***.com/questions/34818/… 和 dba.stackexchange.com/questions/18719/… 和另一个相关问题,关于它是否重要***.com/questions/6692021/… microsoft connect: ALTER TABLE syntax for changing column order - 响应是像往常一样 WONTFIX 的巧克力茶壶品种 【参考方案1】:

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

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

如果您希望列按特定顺序/分组而不改变它们的物理顺序,您可以创建一个您想要的任何视图。

【讨论】:

【参考方案2】:

我认为这里的每个人都缺少的是,虽然不是每个人都必须处理安装在全国和世界各地的相同软件系统的 10 个、20 个或 1000 个实例,但我们这些设计商业销售软件的人却这样做。因此,我们随着时间的推移扩展系统,在需要新功能时通过添加字段来扩展表,并且当这些字段被确定属于现有表时,因此,经过十多年的扩展、增长、添加字段等到表格,然后必须从设计、支持到有时挖掘原始数据/故障排除以调试新功能错误,在最初的少数几个中没有您想要看到的主要信息,这是令人难以置信的恶化字段,当您的表可能有 30、40、50 甚至 90 个字段时,是的,在严格规范化的数据库中。

出于这个确切的原因,我经常希望我能做到这一点。但是没有完全按照 SQL 所做的那样,按照我想要的方式为新表构建一个创建脚本,将插入写入它,然后从现有表中删除所有现有的约束、关系、键、索引等,并重命名“新”表恢复为旧名称,然后读取所有这些键、关系、索引等......

这不仅乏味、耗时,而且……再过五年,它需要再次发生。

大量工作几乎值得,但关键是,这不会是我们最后一次需要这种能力,因为我们的系统将继续增长、扩展,并在一个古怪的有序驱动中获得领域根据需要/设计添加。

大多数开发人员从服务于单个公司或非常特定的硬盒市场的单一系统的角度进行思考。

“现成的”但显着进步的设计师和市场开发领导者总是不得不一遍又一遍地处理这个问题,如果有人有创意解决方案,他们会喜欢。这可以轻松地为我的公司每周节省十几个小时,而不必滚动或记住“那个”字段在源数据表中的位置。

【讨论】:

我们遇到了同样的问题并创建了一个存储过程来自动化这个过程(重命名、创建新表、复制、重新创建所有外键、约束等)。您只需要传入表名和列的新顺序。如果这实际上可以每周为您的公司节省几十个小时,那么您应该花时间编写类似的脚本。对我们来说,只需要大约 2 到 3 天的时间就可以有一个稳定的脚本,我们经常使用该脚本对列进行重新排序。它负责我们在 SqlServer 中使用的所有功能(例如部分索引、索引视图等),并且仅包含大约 400 个 LOC。 我不知道他们为什么不能以某种方式抽象出列布局。它不必对列进行物理重新排序! Sql Server 中的 PHD 水平和超越工程的数量着实令人吃惊。当你考虑到查询计划生成的复杂性、统计信息、索引和没有人站起来说'让我们只做一个代表逻辑顺序的表。 FieldID GuidOrderBy int。完毕。然后 SSMS 或 SELECT * 使用它。如果您是完美的 DBA 并且不想要它,请将其关闭。非常令人沮丧。现在我的桌子已经足够大了,我不能再强行使用它了。 我知道这是一条旧评论,但是当您更改表的架构并点击发布时,数据库项目中的 Visual Studio 会自动创建用于物理列重新排序的 SQL 脚本。【参考方案3】:

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

如果您的所有查询都是用SELECT * FROM TABLE 编写的 - 那么它们将显示在输出中,因为它们是在 SQL 中布局的。

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

【讨论】:

【参考方案4】:

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

如果您不喜欢这样做,您总是可以按照您想要的顺序创建一个包含列的表格视图并使用它?

编辑:被打败了!

【讨论】:

【参考方案5】:

有一种方法,但它只是暂时用于查询本身。例如,

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

FirstName、LastName、PhoneNumber、Email 和 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

我希望这会有所帮助,我想通了,因为我需要自己做这件事。

【讨论】:

在这个查询中 Select LastName, * From T_Testing,你会得到 LastName 两次。【参考方案6】:
    将现有表编写到查询窗口中。 针对测试数据库运行此脚本(删除 Use 语句) 使用 SSMS 进行所需的列更改 单击生成更改脚本(最左侧和最底部的图标) 按钮栏,默认) 将此脚本用于您的真实表

脚本所做的只是创建具有所需列顺序的第二个表,将所有数据复制到其中,删除原始表,然后重命名辅助表以代替它。如果您需要部署脚本,这确实可以节省您自己编写的时间。

【讨论】:

【参考方案7】:

如果不重新创建整个表,则无法更改列的顺序。如果您只有几个数据库实例,您可以为此使用 SSMS(选择表并单击“设计”)。

如果手动流程的实例过多,您应该尝试以下脚本: https://github.com/Epaminaidos/reorder-columns

【讨论】:

【参考方案8】:

可以使用 SQL 直接修改系统表来完成。例如,看这里:

Alter table - Add new column in between

但是,除非绝对必要,否则我不建议使用系统表。

【讨论】:

以上是关于我可以对表中的列进行逻辑重新排序吗?的主要内容,如果未能解决你的问题,请参考以下文章

对表中的列排序

对表中的列排序

如何在sqlite中对表中的行进行排名?

使用 Javascript 选择表中的列并对其进行排序

PyQt5:启用对表中的特定列进行排序

在oracle中怎么对一张表中的列进行循环,比如说,我执行第一个字段,再执行第二个。。。一直到N