SQL:更改表的数据列 - 保留列顺序

时间:2011-07-19 21:11:12

标签: c# sql

我被分配了更改SQL表中某些数据列的任务(如果重要的话,使用Sql CE Server 3.5)。

这些表格是从数百个逗号分隔的Excel文本文档中填充的。

代码确定了列的数据类型并创建了表。

稍后,我需要能够回来并说:“不,这个带有'Y'和'N'的列需要更改为布尔类型而不是字符类型。”

我找到了有关如何Alter the Table(删除列并插入新列)的信息,但是我能够将表的列恢复为之前的列索引值,例如“插入索引= X“?

enter image description here

4 个答案:

答案 0 :(得分:3)

无法通过ALTER TABLE在特定索引处添加列。像Sql Server Management Studio和Visual Studio Premium with Database工具这样的工具可以做到这一点。但至少Visual Studio通过一种解决方法来实现它:

  1. 删除与表相关的所有约束,包括指向它的FK。
  2. 在临时名称下创建一个包含新布局的表。
  3. 移动所有数据(可能包括IDENTITY INSERT以保留IDENTITY列)
  4. 放下原始表格。
  5. 使用临时名称重命名表。
  6. 重新创建约束。
  7. 如果您有可能,我会深深推荐Visual Studio Premiums DB项目。它的部署引擎可以自动为您处理。

答案 1 :(得分:1)

有几种方法可以解决这个问题。

  1. 当Anders注意到要从头开始重新创建表时
  2. 不要依赖表格的列顺序。而是使用一个抽象层,例如Views。 (SQL视图或.NET对象视图)
  3. 不要删除并重新创建列,而是改变列
  4. 第3个选项很棘手,因为您必须在更改之前更新值。 例如

    Create table #temp  (foo char(1), bar int)
    Insert into #temp VALUES ('Y', 0)
    Insert into #temp VALUES ('N', 1)
    
    UPDATE #temp 
    SET foo = CASE WHEN foo = 'Y' THEN 1 ELSE 0 END
    
    ALTER table #temp  alter column foo bit
    SELECT * FROM #temp
    

    这种情况很容易。例如,将varchar(50)转换为日期时间会有点困难

答案 2 :(得分:1)

您可以只更改列,然后您不必担心订购它。

ALTER TABLE myTable
ALTER COLUMN myColumn Boolean

答案 3 :(得分:0)

有这样的“肮脏伎俩”:

Reset Identity Column Index

但老实说,我从来没有这样做,因为你需要关心DB隐含的下一个索引。可能是我遗漏了一些东西,但为什么不在你自己的 ID上构建你的数据库关系,你可以完全控制它们。

问候。