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

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

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

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

0
额外 编辑
意见: 3
另请参阅
额外 作者 Tim Abell,
额外 作者 Tim Abell,
和另一个相关的问题,关于它是否重要时的性能空间影响 stackoverflow.com/questions/6692021/…
额外 作者 Tim Abell,
microsoft connect:更改列顺序的ALTER TABLE语法 - 响应是巧克力 - 像往常一样WONTFIX -teapot品种
额外 作者 Tim Abell,
答案太晚了,但看看这个链接。 blog.sqlauthority.com/2013/03/11/…
额外 作者 sqluser,

8 答案

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

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

编辑:殴打!

0
额外

您无法以编程方式(以安全的方式)执行此操作,而无需创建新表。

提交重新排序时,Enterprise Manager执行的操作是创建新表,移动数据,然后删除旧表并将新表重命名为现有名称。

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

0
额外

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

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

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

0
额外

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

In case you have too many instances for a manual process, you should try this script: https://github.com/Epaminaidos/reorder-columns

0
额外

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

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

不过,除非绝对必要,否则我不会推荐使用系统表。

0
额外

我认为这里的每个人都缺少什么,虽然不是每个人都必须面对在全国和全世界安装的同一软件系统的10,20或1000个实例......我们这些设计商业销售软件的人都这么做。因此,我们随着时间的推移扩展系统,通过在需要新功能时添加字段来扩展表,并且由于这些字段被确定属于现有的表,并且因此在十年内扩展,增长,添加字段等到表格......然后必须使用设计中的这些表格来支持,有时可以深入挖掘原始数据/故障排除以调试新的功能错误......它令人难以置信地变得越来越难以获得您想要的主要信息在第一批领域内可以看到,当你可能拥有30-40-50甚至90场的桌子,并且是在严格规范化的数据库中。

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

不仅繁琐,耗时,而且......在五年之内,将需要再次发生....

它值得大量工作是如此接近,但重点是......它不会是我们最后一次需要这种能力,因为我们的系统将继续增长,扩展,并使领域处于由需要/设计补充。

大多数开发人员从一个单一的系统角度考虑服务于单个公司或非常具体的硬盘盒市场。

现成的“,但他们的市场空间的发展的先进设计师和领导者将永远必须处理这个问题,一遍又一遍......如果任何人有一个创造性的解决方案,将爱。这可以轻松地为我的公司每周节省十几个小时,只需不必滚动浏览或记住源数据表中“该”字段的位置....

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

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

Lets say you have 5 tables. Table is called T_Testing

名字,姓氏,电话号码,电子邮件和会员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

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

0
额外
在这个查询中选择LastName,*从T_Testing中,你得到两次LastName。
额外 作者 sqluser,
  1. 将现有表格编写到查询窗口。
  2. 针对测试数据库运行此脚本(移除使用语句)
  3. 使用SSMS更改您需要的列
  4. 点击生成更改脚本(左侧最上方和最下方的图标) 按钮栏,默认情况下)
  5. 对你的真实表格使用这个脚本

所有的脚本实际上都是用所需的列顺序创建第二个表格,将所有数据复制到它中,删除原始表格,然后重新命名辅助表格以取代它。如果你想要一个部署脚本,这可以节省你自己编写它。

0
额外