如果我在 Microsoft SQL Server 上向表格添加一列,我能控制这个列在查询时的逻辑顺序吗?
我不想改变磁盘上列的物理布局,但是我希望尽可能按逻辑方式将列分组,以便像SQL Server Management Studio这样的工具方便地显示表格内容。
我知道我可以通过进入表格的“设计”模式并拖动列的顺序来实现这一点,但我希望能够在原始的SQL中进行排序,以便我可以从命令行执行排序脚本。
如果我在 Microsoft SQL Server 上向表格添加一列,我能控制这个列在查询时的逻辑顺序吗?
我不想改变磁盘上列的物理布局,但是我希望尽可能按逻辑方式将列分组,以便像SQL Server Management Studio这样的工具方便地显示表格内容。
我知道我可以通过进入表格的“设计”模式并拖动列的顺序来实现这一点,但我希望能够在原始的SQL中进行排序,以便我可以从命令行执行排序脚本。
如果不创建新表,程序化地进行列重排是不安全的。
当您提交重新排序时,Enterprise Manager会创建一个新表,移动数据,然后删除旧表并将新表重命名为现有名称。
如果您想要特定顺序/分组的列而不改变它们的物理顺序,则可以创建一个视图,该视图可以是任何您想要的样子。
Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing
Select LastName, *
From T_Testing
如果您要使用Where或OrderBy函数,则需要将其标识为Table.Column,以确保正确执行操作。
例如:
Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc
该脚本实际上只是创建了一个带有所需列顺序的第二个表格,将所有数据复制到其中,删除原始表格,然后将次要表格重命名为原始表格。尽管这样做可以节省您自己编写脚本的时间,但它并没有提供解释。
/* 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)将临时表重命名为原始表的名称。