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

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

Can I logically reorder columns in a table?

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

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

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


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

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

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


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

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

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

它非常值得进行大量工作,但是重点是……这不是我们最后一次需要此功能,因为我们的系统将继续增长,扩展并以混乱的顺序驱动领域需要/设计增加。

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

市场上那些"现成的"但有进取心的设计师和开发领导者将总是不得不解决这个问题,一遍又一遍.....如果有人提出的话,她会喜欢一个创造性的解决方案。这可以轻松地每周为我的公司节省十几个小时,而不必滚动或记住源数据表中"那个"字段的位置。


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

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

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


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

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

编辑:殴打!


  • 将现有表编写脚本到查询窗口。
  • 针对测试数据库运行此脚本(删除Use语句)
  • 使用SSMS进行所需的列更改
  • 点击生成更改脚本(位于工具栏最左侧和最底部的图标
    按钮栏,默认情况下)
  • 对您的真实表使用此脚本
  • 该脚本真正要做的就是创建具有所需列顺序的第二个表表,将所有数据复制到其中,删除原始表,然后重命名辅助表以代替它。尽管确实需要部署脚本,但这确实节省了您自己编写代码的麻烦。


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

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

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

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

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

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

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

    1
    2
    Select LastName, *
    From T_Testing

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

    例:

    1
    2
    3
    Select LastName, *
    From T_Testing
    Order By T_Testing.LastName Desc

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


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

    如果您有太多实例无法进行手动处理,则应尝试以下脚本:
    https://github.com/Epaminaidos/reorder-columns


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

    更改表-在两者之间添加新列

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


    推荐阅读