15

我对 T-SQL 有点陌生,来自 MySQL 背景 我仍在适应语法中的不同细微差别。

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

ALTER TABLE [dbo].[InvStockStatus]
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ;

这是我当前的查询,效果很好,除了它在表的末尾添加了字段,我更喜欢 [Name]. 我正在寻找什么语法来表示这个?

4

8 回答 8

25

你不能那样做

例如,如果您有这样的表

create table TestTable(id1 int,id3 int)

并且您想在 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

正如您所看到的,如果您有很多数据,这可能会出现问题,为什么列的位置很重要?只需使用

select col1,col2,col3 from table
于 2010-06-03T17:26:30.673 回答
7

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

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

过去,我对表格的列使用了约定,例如使用

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

这些在扫描表格时会有所帮助。不幸的是,看起来你必须跳过箍来维持任何秩序,所以现在我不得不质疑是否值得拥有和维持这些约定。我的新规则就是把它加到最后。

如果您真的担心从可读性角度来看的顺序,您应该按照您喜欢的任何顺序创建自己的“可读性”视图(可能在不同的模式中)。您可以拥有同一张表的多个视图(一个仅用于核心列,另一个包含通常不相关的内容)。

如果能够对 SQL Server 数据库图表中的列重新排序(仅作为显示的东西),那就太好了,但这是不可能的。

于 2011-04-28T22:59:37.243 回答
7

在任何 RDBMS 中,列的顺序在严格的(功能)意义上实际上是无关紧要的——这只是文档或人类查看的“好东西”。

SQL Server 不支持以任何方式对列进行排序的任何 T-SQL 命令。所以在 T-SQL 中没有语法来完成这个。

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

于 2010-06-03T17:23:16.283 回答
3

您应该始终只在最后添加字段。您应该按您想要的顺序选择字段,但切勿重组现有表以在中间添加一列。这可能会破坏某些事情(人们在没有指定授予人们不应该做这些事情的列的情况下做了一些愚蠢的事情,比如 select * 或 inserts,但他们做了)。

重新创建表可能是一个耗时的过程,没有任何收获,并且在进行过程中可能会导致大量用户投诉和锁定。

于 2010-06-03T17:26:15.027 回答
2

我见过的模式比较工具将创建一个具有所需顺序的新表,然后将数据从旧表复制到新表(使用一些重命名魔法使新表与旧表相似)。考虑到这种方法有多么笨拙,我认为没有 T-SQL 语句可以在特定位置添加新列。

于 2010-06-03T17:24:42.090 回答
1

这是不使用临时表的安全解决方法。将列添加到末尾后,只需转到 SQL Sever Management Studio。单击表格,选择 -> 设计(或修改)并将最后一列拖到您想要的任何位置

这样您就不必担心丢失数据和索引。唯一的其他选择是重新创建表,如果您有大量数据,这可能会出现问题。

这个答案是为了帮助其他人,而不是被接受为答案。

于 2011-06-23T21:30:01.570 回答
1

技术上,或者我应该说,学术上,列添加到表中的顺序,或者它们在数据库内部存储模型中的存储顺序,应该与您无关。您可以简单地列出 SQL 查询的 Select 子句中的列,以控制列或计算表达式在您运行的任何查询的输出中出现的顺序。在内部,数据库可以自由地以任何它认为适合的方式存储实际数据,以优化存储,或帮助将数据元素与磁盘和/或内存边界对齐。

于 2010-06-03T17:25:52.673 回答
0

自发布此问题以来已经过去了相当长的时间,但值得注意的是,虽然将列按特定顺序放置的底层原始 SQL 代码并没有改变生成脚本的过程,但如果您选择这样做,则会得到照顾使用 Visual Studio 中的 SQL Server Data Tools 来管理您的数据库。您部署到的数据库将始终按照您在项目中指定的顺序包含列。

于 2015-01-19T04:34:22.780 回答