C# SQL:更改表';s数据列-保持列顺序

C# SQL:更改表';s数据列-保持列顺序,c#,sql,C#,Sql,我被分配了更改SQL表中某些数据列的任务(如果需要的话,使用SQL CE Server 3.5) 表格由数百个逗号分隔的Excel文本文档填充 代码尝试确定列的数据类型,并创建表 稍后,我需要能够返回并说,“不,这个包含‘Y’和‘N’的列需要更改为布尔类型,而不是字符类型。” 我已经找到了关于如何(删除一列并插入新列)的信息,但是我是否能够将表的列恢复到以前的列索引值,如“insert At Index=X” 无法通过ALTER TABLE在特定索引处添加列。SQLServerManagemen

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

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

代码尝试确定列的数据类型,并创建表

稍后,我需要能够返回并说,“不,这个包含‘Y’和‘N’的列需要更改为布尔类型,而不是字符类型。”

我已经找到了关于如何(删除一列并插入新列)的信息,但是我是否能够将表的列恢复到以前的列索引值,如“insert At Index=X”


无法通过ALTER TABLE在特定索引处添加列。SQLServerManagementStudio和VisualStudioPremium等工具以及数据库工具都可以做到这一点。但至少Visual Studio通过一种变通方法实现了这一点:

  • 删除与该表相关的任何约束,包括指向该表的FK
  • 使用临时名称下的新布局创建表
  • 移动所有数据(可能包括标识插入以保留标识列)
  • 放下原来的桌子
  • 使用临时名称重命名该表
  • 重新创建约束
  • 如果您有可能,我强烈推荐VisualStudio Premium DB项目。它的部署引擎可以自动为您处理此问题。

    有如下“肮脏技巧”:

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


    问候。

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

  • 按照安德斯所说的去做,那就是从头开始重新创建表格
  • 不要依赖表的列顺序。而是使用抽象层,例如视图。(SQL视图或.NET对象视图)
  • 不要删除并重新创建列,而是更改列
  • 第三个选项很棘手,因为您必须在更改之前更新值。 比如说

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

    您只需在适当的位置更改列,就不必担心排序问题

    ALTER TABLE myTable
    ALTER COLUMN myColumn Boolean
    

    我之所以这么做,是因为客户希望他的表的顺序与Excel CSV文件中的顺序相同。这对我来说似乎也没什么意义。好吧,但是你可以维持订单要求,但是有一个标识列+表中的所有列,包括你自己的ID。这是我害怕的答案。我这样做还不足以证明VS Premium DB的合理性。如果没有那么频繁,您可以通过Management Studio手动执行。嗯。。。第三个选项是我最初打算做的,但不确定如何完成我开始的工作。在C#?@jp2code中,可以通过Visual Studio在T-SQL语句中执行类似的操作吗。您可以像正常情况一样使用
    SqlCommand.ExecuteNonQuery
    执行DDL。然而,它可能需要两个声明。一个用于转换数据,另一个用于更改。不一定是按那个顺序。这很简单,可以测试:
    数据转换失败。
    需要先删除所有数据吗?哦——是的,bool只接受0或1——对不起,应该提到这一点。您可以在视图中很容易地将其表示为Y或N,或者稍后再选择。顺便说一句,对于大多数解释,0=false或no,1=true或yes。