代码之家  ›  专栏  ›  技术社区  ›  Himadri

如何使用SQL Server 2005中的SQL查询更改表中的列顺序?

  •  78
  • Himadri  · 技术社区  · 15 年前

    如何使用SQL Server 2005中的SQL查询更改表中的列顺序?

    我想使用SQL查询重新排列表中的列顺序。

    20 回复  |  直到 6 年前
        1
  •  78
  •   marc_s HarisH Sharma    15 年前

    你不能。列顺序只是我们人类关心的一个“修饰”的事情——对于SQL Server来说,它几乎总是完全不相关的。

    当您更改列顺序时,SQL Server Management Studio在后台执行的操作是使用新的 CREATE TABLE 命令,复制旧表中的数据,然后将其删除。

    没有用于定义列顺序的SQL命令。

        2
  •  23
  •   lexu    15 年前

    您必须按照希望返回的顺序显式列出字段,而不是使用*作为“默认”顺序。

    原始查询:

    select * from foobar
    

    收益率

    foo bar
    --- ---
      1   2
    

    现在写

    select bar, foo from foobar
    
    bar foo
    --- ---
      2   1
    
        3
  •  17
  •   Community paulsm4    7 年前

    按照 http://msdn.microsoft.com/en-us/library/aa337556.aspx

    无法使用Transact-SQL语句执行此任务。

    嗯,可以,用 create 复制/ drop /重命名,答复者为 komma8.komma1

    也可以使用SQL Server Management Studio

    1. 对象资源管理器 ,右键单击包含要重新排序的列的表,然后单击 设计 (在版本中修改。2005 SP1或更早版本)
    2. 选择要重新排序的列名称左侧的框。(通过按住[SHIFT]或 键盘上的[ctrl]键。)
    3. 将列拖到表中的其他位置。

    然后单击保存。此方法实际上会删除并重新创建表,因此可能会发生一些错误。

    如果 变化跟踪 为数据库和表启用了选项,不应使用此方法。

    如果它被禁用,则 阻止保存需要重新创建表的更改 应在“工具”菜单中清除“选项”>“设计器”,否则 “不允许保存更改” 将发生错误。

    • 禁用 阻止保存需要重新创建表的更改 Microsoft强烈建议不要使用该选项,因为它会导致在重新创建表时删除现有的更改跟踪信息,因此您应该 如果启用了更改跟踪,则从不禁用此选项!

    在创建主键和外键的过程中也可能会出现问题。

    如果发生上述任何错误,保存将失败,这将使您得到原始的列顺序。

        4
  •  11
  •   Thorsten    15 年前

    这类似于在查询结果中排序记录的问题。通常没有人喜欢正式正确的答案;-)

    接下来是:

    • 根据SQL标准,表中的列没有“排序”
    • 因此,a select * 不强制按特定顺序返回列
    • 通常,每个RDBMS都有一种“默认”顺序(通常是将列添加到表中的顺序,或者是 create table' or in the alter table add`语句
    • 因此,如果您依赖于列的顺序(因为您使用查询的结果从列的位置poullate一些其他数据结构),请按照您想要的顺序显式地列出列。
        5
  •  9
  •   mevdiven    15 年前

    当然,您可以更改SQL语句中列的顺序。但是,如果要抽象表的物理列顺序,可以创建视图。即

    CREATE TABLE myTable(
        a int NULL,
        b varchar(50) NULL,
        c datetime NULL
    );
    
    
    CREATE VIEW vw_myTable
    AS
    SELECT c, a, b
      FROM myTable;
    
    select * from myTable;
    a  b  c
    -  -  -
    
    select * from vw_myTable
    c  a  b
    -  -  -
    
        6
  •  5
  •   komma8.komma1    10 年前

    您可以通过创建一个新表、复制所有数据、删除旧表,然后重命名新表来替换旧表来完成此操作。

    还可以向表中添加新列、逐列复制数据、删除旧列,然后重命名新列以匹配旧列。下面是一个简单的例子: http://sqlfiddle.com/#!3/67af4/1

    CREATE TABLE TestTable (
        Column1 INT,
        Column2 VARCHAR(255)
    );
    GO
    
    insert into TestTable values(1, 'Test1');
    insert into TestTable values(2, 'Test2');
    GO
    
    select * from TestTable;
    GO
    
    ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
    ALTER TABLE TestTable ADD Column1_NEW INT;
    GO
    
    update TestTable 
    set Column1_NEW = Column1, 
        Column2_NEW = Column2;
    GO
    
    ALTER TABLE TestTable DROP COLUMN Column1;
    ALTER TABLE TestTable DROP COLUMN Column2;
    GO
    
    sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
    GO
    sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
    GO
    
    select * from TestTable;
    GO
    
        7
  •  5
  •   Tim Connolly    8 年前

    在SQLServer Management Studio中:

    工具->选项->设计器->表和数据库设计器

    • 取消选择“防止保存需要重新创建表的更改”。

    然后:

    • 右键单击要为其重新排序列的表。
    • 单击“设计”。
    • 按所需顺序拖动列。
    • 最后,单击保存。

    SQLServerManagementStudio将删除该表并使用数据重新创建它。

        8
  •  1
  •   Hemanth Nukala    9 年前

    如果表中有足够的列,则可以尝试此操作。首先创建一个具有首选列顺序的新表。

        create table new as select column1,column2,column3,....columnN from table_name;
    

    现在使用DROP命令删除表

        drop table table_name;
    

    现在,将新创建的表重命名为旧表名。

        rename new to table_name;
    

    现在选择该表,您可以根据以前的喜好重新排列列。

        select * from table_name;
    
        9
  •  1
  •   Subhankar    8 年前

    SQL Server在内部生成脚本。它用新的更改创建一个临时表,复制数据并删除当前表,然后从临时表重新创建表插入。我从“生成更改脚本”选项SSMS 2014中找到它。这样的脚本。从 Here: How to change column order in a table using sql query

    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_emps
        (
        id int NULL,
        ename varchar(20) NULL
        )  ON [PRIMARY]
    GO
    ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
    GO
    IF EXISTS(SELECT * FROM dbo.emps)
         EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
            SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
    GO
    DROP TABLE dbo.emps
    GO
    EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' 
    GO
    COMMIT
    
        10
  •  0
  •   Chagbert    9 年前

    在一天结束的时候,您不能在MS SQL中这样做。我最近使用从查找表中读取的存储过程在执行(应用程序启动)时创建了表。当我创建了一个视图,将它们与之前手动创建的另一个表(相同的模式,带数据)结合在一起时,它失败了——仅仅是因为我对视图使用了“select*union select*”。同时,如果只使用通过存储过程创建的那些,我就成功了。

    综上所述:如果有依赖于列顺序的应用程序,那么它的编程确实不好,将来肯定会产生问题。列应该“感觉”到可以在任何地方使用,并且可以用于任何数据处理(插入、更新、选择)。

        11
  •  0
  •   Aashay Shah    9 年前

    您可以使用SQL查询来更改它。下面是用于更改列顺序的SQL查询。

    ALTER TABLE table name 
    CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
    
        12
  •  0
  •   Pang waqas ur Rehman    7 年前

    您可以通过以下步骤实现:

    1. 删除原始表的所有外键和主键。

    2. 重命名原始表。

    3. 使用CTA按照您想要的顺序创建原始表。

    4. 放下旧桌子。

    5. 将所有约束应用回原始表

        13
  •  0
  •   Ivan    7 年前

    如果要重新排序的列是最近创建的,并且是空的,那么可以删除这些列并按正确的顺序重新添加。

    这发生在我身上,手动扩展数据库以添加新功能,我遗漏了一列,当我添加它时,序列是不正确的。

    在这里找不到足够的解决方案之后,我只需使用以下命令更正表。

    ALTER TABLE  tablename  DROP COLUMN  columnname; 
    ALTER TABLE  tablename  ADD columnname columntype;
    

    注意:只有在要删除的列中没有数据的情况下才执行此操作。

    有人说列队顺序无关紧要。我经常使用SQL Server Management Studio“生成脚本”来创建数据库架构的文本版本。为了有效地版本控制这些脚本(Git)并进行比较(WinMerge),兼容数据库的输出必须相同,突出显示的差异是真正的数据库差异。

    列顺序很重要,但只是对某些人,而不是对每个人!

        14
  •  0
  •   vikas Chaturvedi    6 年前

    在SQLServer Management Studio中:

    工具->选项->设计器->表和数据库设计器

    取消选择“防止保存需要重新创建表的更改”。

    现在您可以重新排序表了。

        15
  •  0
  •   Nauris KrÅ«miņš    6 年前

    为了有一个特定的列顺序,您需要按您希望的顺序逐列选择。 选择顺序指示列在输出中的顺序。

        16
  •  0
  •   veben    6 年前

    尝试此命令:

    alter table students modify age int(5) first; 
    

    这将使年龄位置变为第一个位置。

        17
  •  -1
  •   solairaja    15 年前

    使用

    SELECT * FROM TABLE1
    

    显示表的默认列顺序。

    如果要更改列的顺序。

    指定要相应显示的列名称

    SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
    
        18
  •  -1
  •   Karthik.M    9 年前

    您可以使用索引..索引后,如果从XXXX中选择*结果应根据索引,但仅限于结果集。非表结构

        19
  •  -2
  •   farhan sait    8 年前

    首先修改表名modify columnname int(5); 将列置于第一 在(table name)之后更改表名modify columnname int(5);

        20
  •  -3
  •   lecaoquochung    8 年前

    示例:在表格状态中,在字段价格之后更改字段优先级的位置。

    ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;