Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer2005中使用sql查询更改表中的列顺序?_Sql_Sql Server 2005 - Fatal编程技术网

如何在SQLServer2005中使用sql查询更改表中的列顺序?

如何在SQLServer2005中使用sql查询更改表中的列顺序?,sql,sql-server-2005,Sql,Sql Server 2005,如何在SQLServer2005中使用SQL查询更改表中的列顺序 我想使用SQL查询重新排列表中的列顺序。您必须按照希望返回的顺序显式列出字段,而不是使用*作为“默认”顺序 原始查询: select * from foobar 返回 foo bar --- --- 1 2 现在写 select bar, foo from foobar bar foo --- --- 2 1 使用 它显示表的默认列顺序 如果要更改列的顺序 指定要相应显示的列名 SELECT COLUMN1

如何在SQLServer2005中使用SQL查询更改表中的列顺序


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

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

原始查询:

select * from foobar
返回

foo bar
--- ---
  1   2
现在写

select bar, foo from foobar

bar foo
--- ---
  2   1
使用

它显示表的默认列顺序

如果要更改列的顺序

指定要相应显示的列名

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1

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

SQL Server Management Studio在后台更改列顺序时所做的是使用新的
CREATE table
命令从头开始重新创建表,从旧表复制数据,然后将其删除


没有SQL命令来定义列顺序。

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

下面是:

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

当然,您可以更改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
-  -  -

您可以通过创建一个新表,复制所有数据,删除旧表,然后重命名新表以替换旧表来实现

您还可以向表中添加新列,逐列复制数据,删除旧列,然后重命名新列以匹配旧列。下面是一个简单的示例:

使用Transact-SQL语句不支持此任务

好的,可以使用
create
/copy/
drop
/rename来完成,答案是

也可以使用SQLServerManagementStudio

  • 在对象资源管理器中,右键单击包含要重新排序的列的表,然后单击设计(在版本2005 SP1或更早版本中修改)
  • 选择要重新排序的列名左侧的框。(您可以通过按住[shift]或键来选择多个列。) 键盘上的[ctrl]键。)
  • 将列拖动到表中的其他位置
  • 然后单击save。此方法实际上会删除并重新创建表,因此可能会发生一些错误

    如果为数据库和表启用了更改跟踪选项,则不应使用此方法

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

    • Microsoft强烈建议禁用“防止保存需要重新创建表的更改”选项,因为这会导致在重新创建表时删除现有的更改跟踪信息,因此,如果启用了更改跟踪,您应该永远不要禁用此选项!
    在主键和外键创建过程中也可能出现问题


    如果出现上述任何错误,保存将失败,这将使您保留原始列顺序。

    最后,您无法在MS SQL中执行此操作。我最近在运行中创建了表(应用程序启动)使用从查找表读取的存储过程。当我创建一个视图,将这些视图与之前手动创建的另一个表(相同的模式,带有数据)组合在一起时,它失败了-只是因为我对视图使用了“Select*UNION Select*”。同时,如果我只使用通过存储过程创建的视图,我就成功了


    总之:如果有任何应用程序依赖于列的顺序,那么它确实不是很好的编程,并且肯定会在将来产生问题。列应该“感觉”自由地存在于任何地方,并用于任何数据处理(插入、更新、选择).

    您可以使用索引。.索引后,如果从XXXX中选择*,则结果应与索引一致,但仅与结果集一致。.而不是表的结构。

    您可以使用SQL查询进行更改。以下是更改列顺序的SQL查询

    ALTER TABLE table name 
    CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
    

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

  • 删除原始表的所有外键和主键

  • 重命名原始表

  • 使用CTA按所需顺序创建原始表

  • 放下那张旧桌子

  • 将所有约束应用回原始表


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

        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;
    

    更改表名先修改columnname int(5); 将把该列置于第一位
    更改表名在(tablename)之后修改columnname int(5);

    在SQLServer Management Studio中:

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

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

    • 右键单击
          rename new to table_name;
      
          select * from table_name;
      
      ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;
      
      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
      
      ALTER TABLE  tablename  DROP COLUMN  columnname; 
      ALTER TABLE  tablename  ADD columnname columntype;
      
      alter table students modify age int(5) first; 
      
      +---+---+---+
      | A | B | C |
      +---+---+---+
      
      +---+---+---+---+
      | A | B | C | C |
      +---+---+---+---+
                |___^
      
      +---+---+---+---+
      | A | B | B | C | 
      +---+---+---+---+
            |___^
      
      +---+---+---+---+
      | A | D | B | C | 
      +---+---+---+---+
      
      select column1, column2, t.* from table t