2010-03-21 113 views
4

我遇到了需要更改SQL Server 2008中列的顺序/为现有表添加新列的情况。它不允许我执行没有下降和重新创建。但那是在生产系统中并且在该表中有数据。我可以对数据进行备份,然后删除现有表并更改顺序/添加新列并重新创建它,将备份数据插入到新表中。在SQL Server 2008中更改列顺序/为现有表添加新列

有没有最好的方法来做到这一点,而不会丢失和重新创建。我认为SQL Server 2005将允许这个过程在不改变现有表结构的同时不删除和重新创建。

感谢

回答

2

一种可能性就是不用担心重新排序表中的列,只需通过添加列来修改它。然后,根据需要创建一个包含列的视图 - 假定该顺序非常重要。视图可以很容易地改变,以反映你想要的任何顺序。由于我无法想象这个顺序对程序化应用程序来说很重要,因此这个视图应该足以适用于那些可能很重要的手动查询。

+0

在很多情况下,例如当我们使用某些ORM(例如EF)时,顺序非常重要采用DB First方法,我想在多个主机上发布Web应用程序。此外,当我查看表格和图表时,我希望在数据库中有一个清晰的视图。我不需要看到一些表格并想象其他的排序。 – QMaster 2014-03-13 06:35:57

8

你不能真正改变在SQL Server 2008中的表列的顺序 - 这也是几乎无关紧要(至少应该是,在关系模型)。

对于SQL Server Management Studio中的可视化设计人员,只要您做出过大的更改,为SSMS执行此操作的唯一可靠方法就是以新格式重新创建表,复制数据,然后放下旧桌子。你无法做到这一点改变它。

可以在任何时候做的是新列添加到表或使用SQL DDL语句删除表中现有列什么:

ALTER TABLE dbo.YourTable 
    ADD NewColumn INT NOT NULL ........ 

ALTER TABLE dbo.YourTable 
    DROP COLUMN OldColumn 

这会工作,但你不会能够影响列顺序。但是,对于您的正常操作,表格中的列顺序完全无关紧要 - 这完全是您的打印输出或图表中的一个整体问题.....所以为什么你如此专注于特定的列顺序?

+0

列顺序更改,仅用于客户端的相同请求 – rmdussa 2010-03-21 23:14:40

+3

@rmdussa我从不让客户对表格有任何权限。我通常不会将表定义作为我的数据库提供的服务定义的一部分。因此,我可以自由地进行更改,而且我不必为了演示目的而承诺任何特定的表格设计。视图,表值函数,存储过程等是我的数据库通常暴露的接口。 – 2010-03-21 23:53:15

+0

@rmdussa:那么,在这种情况下,只需在您的SELECT语句中按所需顺序列出所需的字段 - 其他任何内容都不需要...... – 2010-03-22 05:57:13

3

有一种方法通过更新SQL服务器系统表中做到这一点:

1)连接到SQL Server在DAC mode

2)运行查询,将更新列命令:

update syscolumns 
set colorder = 3 
where name='column2' 

但是这种方式并不是可以接受的,因为你可以在DB中销毁某些东西。

+3

我肯定**不会推荐使用“sys *”系统目录表!你只是**要求**的麻烦.... – 2010-03-21 23:00:22

+0

我已经写道,它不被推荐。但据我了解,问题的作者正是想要这样做。因为只有一种方法可以在不添加/删除列的情况下限制collumns的顺序 - 更新数据库中的syscolumns表。 – Anton 2010-03-22 08:29:19

1

正如其他海报所说,没有重写表格(但SSMS将生成脚本来为你做这件事)没有办法。

如果你还在设计/开发中,我当然会建议让列顺序合乎逻辑 - 没有什么比添加新列成为多列主键的一部分更糟糕,并且让它在没有靠近其他列的地方更糟!但是你必须重新创建表格。

有一次我使用了第三方系统,它总是按字母顺序排列它们的列。这对于在他们的系统中查找专栏很有帮助,但是当他们启动他们的软件时,我们的程序和观点就失效了。不过,这是旧版本的SQL Server。我认为自2000年以来,我没有看到列序不正确的问题。当Access用于链接到SQL表时,我相信它在表链接时锁定在列定义中,这显然在几乎所有表定义更改时都有问题。

0

是否有可能使用其所有数据对表格进行脚本编写。 对记事本中的脚本文件做一个编辑++

因此用新列重新创建表,但是相同。 只是一个建议,但它可能需要一段时间才能完成。 除非你自己写一个可以使用该文件并应用规则的小型c#应用程序。

如果只有notepadd ++支持查找和移动运营

0

我认为最简单的方法是重新创建表,你用不同的名称想要的方式,然后将数据在从现有表复制,降它,并重新命名新表。