T-SQL按特定顺序添加列

Are*_*ren 15 t-sql sql-server alter-table

我对T-SQL有点新意,来自MySQL背景我还在适应语法中的不同细微差别.

我想在特定的一个后添加一个新列.我发现这AFTER是一个有效的关键字,但我认为这不适合这项工作.

ALTER TABLE [dbo].[InvStockStatus]
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ;
Run Code Online (Sandbox Code Playgroud)

这是我目前的查询,效果很好,但它增加了外地在表的末尾,身份证宁愿它添加 [Name].我正在寻找代表这个的语法是什么?

SQL*_*ace 23

你不能这样做

例如,如果你有这样的表

create table TestTable(id1 int,id3 int)
Run Code Online (Sandbox Code Playgroud)

并且您想在id1和id3之间添加另一个列id2,那么如果您使用设计器,这就是SQL Server在场景后面做的事情

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_TestTable
    (
    id1 int NULL,
    id2 int NULL,
    id3 int NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_TestTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
     EXEC('INSERT INTO dbo.Tmp_TestTable (id1, id3)
        SELECT id1, id3 FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO
COMMIT
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,如果您有大量数据,这可能会有问题,为什么列位于何处?只是用

select col1,col2,col3 from table
Run Code Online (Sandbox Code Playgroud)


And*_*dyM 6

从功能数据库的角度来看,元组可以按任何顺序出现是正确的.

但是真空中不存在数据库.总有一个人会想要读取表模式(dbas,devs)并绕过它并维护或编写查询.

在过去,我使用了表的列的约定,例如用表订购表

  1. 首先是主键
  2. 外键
  3. 然后经常使用的列
  4. 其他专栏
  5. 最后审核相关栏目

这些在扫描桌子时有帮助.不幸的是,你似乎必须通过箍来维持任何秩序,所以现在我不得不质疑它是否值得拥有和维护这些约定.我的新规则只是将它添加到最后.

如果您从可读性角度真的担心订单,那么您应该按照您想要的任何顺序创建自己的"可读性"视图(可能在不同的模式中).您可以拥有同一个表的多个视图(一个用于核心列,另一个包含通常不相关的东西).

能够在SQL Server数据库图表中重新排序列(仅作为显示内容)会很高兴,但这是不可能的.


mar*_*c_s 5

在任何RDBMS中,列的顺序在严格(功能)意义上都是无关紧要的 - 它只是文档或人类可以看到的"精确".

SQL Server不支持任何T-SQL命令以任何方式对列进行排序.所以在T-SQL中没有语法来实现这一点.

改变它的唯一方法是在SSMS中使用可视表设计器,当您在列中移动列或在表的中间插入列时,它实际上从头开始重新创建整个表.