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

ukdjmx9f  于 2023-01-08  发布在  其他
关注(0)|答案(9)|浏览(161)

如果向Microsoft SQL Server中的表添加列,是否可以控制该列在查询中的逻辑显示位置?
我不想弄乱磁盘上列的物理布局,但我希望在可能的情况下对列进行逻辑分组,以便SQL Server Management Studio等工具以方便的方式列出表的内容。
我知道我可以通过SQL Management Studio进入表的“设计”模式并拖动列的顺序来完成此操作,但我希望能够在原始SQL中完成此操作,以便可以执行命令行脚本中的排序。

unftdfkk

unftdfkk1#

如果不创建一个新表,您就无法通过编程(以一种安全的方式)来完成此操作。
提交重新排序时,Enterprise Manager执行的操作是创建新表、移动数据,然后删除旧表并将新表重命名为现有名称。
如果您希望您的列以特定的顺序/分组而不改变它们的物理顺序,您可以创建一个视图,它可以是您想要的任何视图。

mlnl4t2r

mlnl4t2r2#

我认为这里的每个人都缺少的是,虽然不是每个人都必须处理安装在全国和世界各地的同一软件系统的10个,20个或1000个示例,但我们这些设计商业销售软件的人这样做。因此,我们随着时间的推移扩展系统,在需要新功能时通过添加字段来扩展表格,并且当那些字段被识别为确实属于现有表时,并且因此,经过十年的扩展、增长、向表添加字段等,然后不得不从设计到支持,到有时挖掘原始数据/故障排除以调试新的功能性错误,当您的表可能有30、40、50甚至90个字段时,如果在前几个字段中没有您想要看到的主要信息,这将是非常令人恼火的,是的,在一个严格规范化的数据库中。
我经常希望我能做到这一点,正是出于这个原因。但是除了做SQL所做的事情,按照我想要的方式为新表构建一个创建脚本,向它写入插入,然后从现有表中删除所有现有的约束,关系,键,索引等,并将“新”表重命名回旧名称,然后阅读所有这些键,关系,索引,等等等等。
这不仅是乏味的,耗时的,但...在五年多,它将需要再次发生。
这是如此接近值得的大量工作,但重点是,这不会是我们最后一次需要这种能力,因为我们的系统将继续增长,扩展,并获得一个由需求/设计添加驱动的奇怪的秩序领域。
大多数开发人员从服务于单个公司或非常特定的硬盒市场的单个系统的Angular 来考虑。
在他们的市场空间中,那些“现成的”但非常进步的设计师和开发领导者总是不得不一遍又一遍地处理这个问题,如果有人有创造性的解决方案,他们会很喜欢。这可以很容易地为我的公司每周节省十几个小时,只是不必滚动或记住“那个”字段在源数据表中的位置。

wlp8pajw

wlp8pajw3#

Management Studio执行此操作时,它会创建临时表、复制所有内容、删除原始表并重命名临时表。没有简单的等效T-SQL语句。
如果您不喜欢这样做,您可以创建一个表视图,其中的列按照您喜欢的顺序排列,然后使用它。
编辑:被打败了!

b09cbbtk

b09cbbtk4#

如果我理解您的问题,您希望影响在existing查询中第一、第二、第三等返回哪些列,对吗?
如果您的所有查询都是用SELECT * FROM TABLE编写的,那么它们将以SQL中的布局显示在输出中。
如果您的查询是用SELECT Field1, Field2 FROM TABLE编写的,那么它们在SQL中的布局顺序并不重要。

eqzww0vc

eqzww0vc5#

有一种方法,但只是暂时用于查询本身。例如,
假设您有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

我希望这能帮上忙,我想通了,因为我需要自己做这件事。

bweufnob

bweufnob6#

1.为查询窗口编写现有表的脚本。
1.对测试数据库运行此脚本(删除Use语句)
1.使用SSMS进行所需的列更改
1.单击“生成变更脚本”(默认情况下,位于按钮栏最左侧和最底部的图标)
1.对真实的表使用此脚本
脚本实际上所做的就是创建一个具有所需列顺序的第二个表table,将所有数据复制到其中,删除原始表,然后重命名第二个表来取代它。这确实保存了您自己编写脚本的时间,尽管您需要部署脚本。

nxagd54h

nxagd54h7#

如果不重新创建整个表,就无法更改列的顺序。如果您只有数据库的几个示例,则可以使用SSMS进行此操作(选择表并单击“设计”)。
如果手动流程的示例太多,则应尝试使用以下脚本:https://github.com/Epaminaidos/reorder-columns

4zcjmb1e

4zcjmb1e8#

可以使用SQL通过直接修改系统表来完成。例如,请看下面:
Alter table - Add new column in between
但是,我不建议使用系统表,除非绝对必要。

yuvru6vn

yuvru6vn9#

1.在SSMS中以设计模式打开表:

1.重新排序列:

不要保存更改,这一点很重要。
1.点击“生成变更脚本”按钮:

1.现在将打开一个窗口,其中包含应用此更改的脚本:

从窗口复制文本。
在此示例中,它生成了以下代码:

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_MyTable
    (
    Id int NOT NULL,
    Name nvarchar(30) NULL,
    Country nvarchar(50) NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_MyTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.MyTable)
     EXEC('INSERT INTO dbo.Tmp_MyTable (Id, Name, Country)
        SELECT Id, Name, Country FROM dbo.MyTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.MyTable
GO
EXECUTE sp_rename N'dbo.Tmp_MyTable', N'MyTable', 'OBJECT' 
GO
COMMIT

正如您所看到的,它所做的是1)创建一个新的临时表,2)将数据复制到临时表,3)删除原始表,以及4)将临时表重命名为原始表的名称。

相关问题