2011-07-19 30 views
2

我已经分配了更改SQL表中某些数据列的任务(使用Sql CE Server 3.5,如果有的话)。SQL:更改表的数据列 - 保留列顺序

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

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

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

我找到了关于如何去掉Alter the Table(删除一列并插入新列)的信息,但是我能否将表格的列恢复到它之前的列索引值,如“Insert At Index = X“?

enter image description here

回答

1

您可以只改变列的位置,然后您就不必担心订购它。

ALTER TABLE myTable 
ALTER COLUMN myColumn Boolean 
+0

这很简短,足以测试:'数据转换失败。是否所有的数据都需要先删除? – jp2code

+0

哦 - 是的,布尔只需要0或1 - 对不起,应该提到这一点。您可以在视图中将其表示为Y或N,或稍后选择。 – Chains

+0

顺便说一句 - 0 = false或no,1 = true或yes - 就大多数解释而言。 – Chains

3

有没有办法在通过ALTER TABLE特定的索引添加一列。像Sql Server Management Studio和Visual Studio Premium数据库工具这样的工具可以做到这一点。但至少Visual Studio通过一种解决方法来做到这一点:

  1. 删除与表相关的任何约束,包括指向它的FK。
  2. 使用临时名称下的新布局创建表格。
  3. 移动所有数据(可能包括IDENTITY INSERT以保留IDENTITY列)
  4. 删除原始表。
  5. 用临时名称重命名该表。
  6. 重新创建约束。

如果您有可能,我深深地推荐Visual Studio Premiums DB项目。它的部署引擎可以为你自动处理。

+0

这就是我害怕的那种答案。我不这样做足以证明VS Premium DB的合理性。 – jp2code

+0

如果不是那么频繁,您可以通过Management Studio手动完成。 –

0

有“肮脏伎俩”是这样的:

Reset Identity Column Index

不过我,说实话,从来没那么做,引起为什么你需要关心的DB暗示下一个索引。可能是我错过了一些东西,但为什么不建立你的数据库关系你自己的 ID,你可以完全控制。

问候。

+0

我只是试图这样做,因为客户希望他的表格的顺序与Excel CSV文件中的顺序相同。对我来说,这似乎也毫无意义。 – jp2code

+0

确定,但您可以维护订单要求,但拥有一个标识列+表格的所有列,包括您自己的标识。 – Tigran

+0

@dowvoter谨慎地解释你的-1? – Tigran

1

有一对夫妇的方式来处理这个

  1. 请执行安德斯指出这是从头
  2. 重新创建表不要依赖表的列顺序。而是使用一个抽象层,例如Views。 (SQL视图或.NET对象视图)
  3. 不要删除并重新列,但改变不是

这第三个选项是棘手的列,因为你面前有ALTER更新值。 例如

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)转换为日期时间会比较困难

+0

嗯...第三种选择是我最初设定的,但不知道如何完成我开始的任务。像这样的事情可以通过C#中的Visual Studio在T-SQL语句中执行? – jp2code

+0

@ jp2code。你可以像普通一样用'SqlCommand.ExecuteNonQuery'来执行DDL。然而,它可能需要两个陈述。一个将数据转换为Alter。不一定按照这个顺序。 –

+0

@ jp2Code当然应该是SqlCeCommand –