代码之家  ›  专栏  ›  技术社区  ›  fastcall

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

  •  83
  • fastcall  · 技术社区  · 16 年前

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

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

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

    8 回复  |  直到 7 年前
        1
  •  68
  •   vzczc    16 年前

    在不创建新表的情况下,不能通过编程(以安全的方式)来执行此操作。

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

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

        2
  •  39
  •   demongolem    12 年前

    我认为这里每个人都缺少的是,虽然不是每个人都必须处理10、20或1000个安装在全国和世界各地的相同软件系统的实例…我们这些设计商用软件的人就是这样做的。因此,我们随着时间的推移扩展系统,通过在需要新功能时添加字段来扩展表,并且当这些字段被识别时,它们确实属于现有表,因此,经过十年的扩展、增长、向表中添加字段等等……然后必须处理这些表,从设计、支持到有时挖掘原始数据/故障排除,以调试新的功能缺陷……如果在前几个字段中没有您希望看到的主要信息,这是非常严重的,因为在严格规范化的数据库中,您可能有包含30-40-50甚至90个字段的表,并且是的。

    出于这个确切的原因,我常常希望我能做到这一点。但是,除了执行SQL所做的操作外,还没有按照我想要的方式为新表构建一个创建脚本,将插入内容写入新表,然后从现有表中删除所有现有约束、关系、键、索引等,并将“新”表重新命名为旧名称,然后读取所有这些键、关系、索引等……

    不仅冗长费时而且…再过五年,就需要再次发生……

    这是如此接近价值的大量工作,然而重点是…这将不是我们最后一次需要这种能力,因为我们的系统将继续增长、扩展,并在需要/设计添加的驱动下得到一个古怪的有序字段。

    大多数开发人员都是从一个单一的系统的角度来考虑,这个系统服务于一家公司或一个非常特定的硬盒市场。

    “现成的”,但显着进步的设计师和领导者的发展在他们的市场空间将永远不得不处理这个问题,一次又一次……如果任何人有一个创造性的解决方案。这很容易使我的公司一周节省十几个小时,而不必滚动查看,或者记住源数据表中的“那个”字段。

        3
  •  5
  •   N00b Pr0grammer TChia    7 年前

    如果我理解您的问题,您希望影响在 现有的 查询,对吧?

    如果所有的查询都是用 SELECT * FROM TABLE -然后,它们将显示在输出中,正如它们在SQL中的布局一样。

    如果您的查询是用 SELECT Field1, Field2 FROM TABLE -那么,它们在SQL中的排列顺序并不重要。

        4
  •  3
  •   tags2k    16 年前

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

    如果您不想这样做,您可以创建一个表视图,其中的列按照您想要的顺序排列,然后使用它?

    编辑:打败!

        5
  •  1
  •   Markus Safar    9 年前

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

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

    firstname、firstname、phonenumber、email和会员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
    

    我希望这有帮助,因为我需要自己去做。

        6
  •  1
  •   Paul    9 年前
    1. 在查询窗口中编写现有表的脚本。
    2. 对测试数据库运行此脚本(删除use语句)
    3. 使用ssms进行所需的列更改
    4. 单击生成更改脚本(最左边和最下面的图标 按钮栏,默认)
    5. 在实际表中使用此脚本

    脚本真正要做的就是用所需的列顺序创建第二个表,将所有数据复制到其中,删除原始表,然后重命名第二个表以取代它。这确实节省了您自己编写的时间,不过如果您需要部署脚本的话。

        7
  •  0
  •   Milan BabuÅ¡kov    12 年前

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

    Alter table - Add new column in between

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

        8
  •  0
  •   Andreas    8 年前

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

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