Como alterar a ordem das colunas em uma tabela usando a consulta sql no sql server 2005?

109

Como alterar a ordem das colunas em uma tabela usando a consulta SQL no SQL Server 2005?

Quero reorganizar a ordem das colunas em uma tabela usando a consulta SQL.

Himadri
fonte
3
Se você está se referindo à alteração da posição das colunas conforme existem na tabela, você precisará criar uma nova tabela com a ordem preferida, inserir os dados da tabela antiga e, em seguida, eliminar a tabela original. Não há outra maneira (que eu saiba) de fazer isso.
Michael Todd,
Você está falando sobre a ordem das colunas em uma instrução SELECT ou a ordem das colunas na definição da tabela?
marc_s

Respostas:

111

Você não pode. A ordem das colunas é apenas uma coisa "cosmética" com a qual nós, humanos, nos preocupamos - para o SQL Server, quase sempre é absolutamente irrelevante.

O que o SQL Server Management Studio faz em segundo plano quando você altera a ordem das colunas é recriar a tabela do zero com um novo CREATE TABLEcomando, copiar os dados da tabela antiga e, em seguida, descartá-los.

Não há comando SQL para definir a ordem das colunas.

marc_s
fonte
4
Não, não existe tal coisa ni SQL Server - e não deveria estar em nenhum RBDMS real - a ordem das colunas não é um conceito relevante para uma tabela SQL
marc_s
68
@marc_s Não há um bom motivo contra o suporte da ordem das colunas. Mesmo que seja apenas visual. Ele simplesmente pode tornar mais fácil olhar para os dados em uma tabela com uma determinada ordem de coluna quando você faz um "SELECT *". Sou um desenvolvedor e faço esse tipo de consulta o tempo todo. Você pode poupar algum tempo com uma boa ordem de colunas predefinida. De qualquer outro ponto de vista, é claro, não faz sentido: nada deve depender da ordem das colunas. A propósito, há uma coluna ORDINAL_POSITION quando você consulta "INFORMATION_SCHEMA.COLUMNS". Não sei o que significa ... mas deve ter algo a ver com isso.
JotaBe de
18
A ordem das colunas é relevante, por exemplo, ao usar INSERT INTO sem especificar os nomes das colunas. Outro exemplo é o índice da coluna ORDER BY em vez do nome da coluna. Obviamente, ambas as práticas não são recomendadas, mas o SQL Server permite, então alguém pode ter usado em algum lugar, possivelmente quebrando o código T-SQL ao alterar a ordem das colunas.
Carvellis
12
@Carvelis: você NUNCA deve usar INSERTsem especificar explicitamente suas colunas!
marc_s
2
@marc_s: com certeza, mas geralmente não sou o único trabalhando em um projeto. Já vi alguns projetos em que as pessoas usaram esse tipo de código.
Carvellis
30

Você deve listar explicitamente os campos na ordem em que deseja que sejam retornados, em vez de usar * para a ordem 'padrão'.

consulta original:

select * from foobar

retorna

foo bar
--- ---
  1   2

agora escreva

select bar, foo from foobar

bar foo
--- ---
  2   1
Lexu
fonte
A resposta acima está errada, não é? Esta resposta mostra literalmente como ordenar as colunas, por que a anterior tem uma marca de seleção e esta não?
Agente Lu
1
@Agent Lu O problema é o texto da pergunta original. Marc e eu interpretamos a pergunta do OP para 'mudar a ordem das colunas' de maneira diferente. Ele apresenta um forte argumento de porque a ordem das colunas é irrelevante na tabela armazenada (embora os nomes sejam). Mostrei como os dados podem ser extraídos em uma ordem de coluna diferente. Não é a mesma coisa!
Lexu
23

de acordo com http://msdn.microsoft.com/en-us/library/aa337556.aspx

Esta tarefa não é compatível com instruções Transact-SQL.

Bem, isso pode ser feito, usando create/ copy / drop/ rename, conforme respondido por komma8.komma1

Ou você pode usar o SQL Server Management Studio

  1. No Object Explorer , clique com o botão direito na tabela com as colunas que você deseja reordenar e clique em Design (Modificar na versão 2005 SP1 ou anterior)
  2. Selecione a caixa à esquerda do nome da coluna que você deseja reordenar. (Você pode selecionar várias colunas segurando as teclas [shift] ou [ctrl] no teclado.)
  3. Arraste a (s) coluna (s) para outro local na tabela.

Em seguida, clique em salvar. Na verdade, esse método elimina e recria a tabela, portanto, podem ocorrer alguns erros.

If Change Tracking opção estiver habilitada para o banco de dados e a tabela, você não deve usar este método.

Se estiver desabilitada, a opção Impedir o salvamento de alterações que exigem a recriação da tabela deve ser desmarcada no menu Ferramentas> Opções> Designers, caso contrário, ocorrerá o erro "Salvar alterações não é permitido" .

  • Desativar a opção Impedir o salvamento de alterações que exigem a recriação da tabela é fortemente desaconselhada pela Microsoft, pois isso faz com que as informações de controle de alterações existentes sejam excluídas quando a tabela é recriada, portanto, você nunca deve desativar esta opção se o Controle de alterações for ativado!

Também podem surgir problemas durante a criação da chave primária e estrangeira.

Se algum dos erros acima ocorrer, o salvamento falhará, o que o deixará com a ordem original das colunas.

robotik
fonte
1
A declaração " This task cannot be performed using Transact-SQL statements." no documento estava errada. Expliquei o autor e pedi a ele que mudasse para " This task is not supported using Transact-SQL statements.". Há cerca de um dia, o autor concordou e o documento foi corrigido. Você pode acompanhar a discussão que tivemos no GitHub .
Ronen Ariely,
@RonenAriely bom trabalho e obrigado por me avisar. Atualizei minha resposta
robotik
Você é muito bem-vindo, @robotik 😀. Espero que todos os que vêm aqui e veem a resposta com mais votos entendam que se trata de um erro total. Infelizmente, as Comunidades geralmente se comportam como um rebanho (gado) e, uma vez que um líder e um dos principais contribuintes (que é considerado um dos maiores especialistas) cometam um erro, outros o seguem, como aconteceu neste tópico. As pessoas continuam a votar em um erro se ele já obteve muitos votos (a abordagem de: "já que todos falam, então é verdade"), e outras pessoas que virão ao fórum pensarão que essa é a resposta correta.
Ronen Ariely
1
@RonenAriely é por isso que eu sempre rolar para baixo :)
robotik
13

Isso é semelhante à pergunta sobre ordenar os registros no resultado de uma consulta .. e normalmente ninguém gosta da resposta formalmente correta ;-)

Então aqui vai:

  • de acordo com o padrão SQL, as colunas em uma tabela não são "ordenadas"
  • como resultado, a select *não força as colunas a serem retornadas em uma ordem específica
  • normalmente, cada RDBMS tem um tipo de ordem "padrão" (geralmente a ordem em que as colunas foram adicionadas à tabela, seja nas create table' or in theinstruções alter table add `
  • portanto, se você confiar na ordem das colunas (porque está usando os resultados de uma consulta para poulate alguma outra estrutura de dados da posição das colunas), liste explicitamente as colunas na ordem em que você deseja.
Thorsten
fonte
11

Claro, você pode alterar a ordem das colunas em uma instrução sql. No entanto, se você deseja abstrair a ordem das colunas físicas das tabelas, pode criar uma visão. ie

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
-  -  -
mevdiven
fonte
isso muda o tempo de consulta?
cego de
@blindguy não, isso não muda seu tempo de consulta
mevdiven
9

No SQLServer Management Studio:

Ferramentas -> Opções -> Designers -> Designers de tabelas e bancos de dados

  • Desmarque 'Impedir o salvamento de alterações que requeiram recriação da tabela'.

Então:

  • clique com o botão direito na tabela para a qual deseja reordenar as colunas.
  • clique em 'Design'.
  • Arraste as colunas para a ordem desejada.
  • finalmente, clique em salvar.

O SQLServer Management Studio eliminará a tabela e a recriará usando os dados.

Tim Connolly
fonte
6

Você pode fazer isso criando uma nova tabela, copiar todos os dados, eliminar a tabela antiga e renomear a nova para substituir a antiga.

Você também pode adicionar novas colunas à tabela, copiar os dados de coluna por coluna, descartar as colunas antigas e renomear as novas colunas para corresponder às antigas. Um exemplo simples abaixo: 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
komma8.komma1
fonte
1
escrevi um procedimento armazenado que faz algo semelhante. Ele automatiza a reconstrução da tabela usando SQL dinâmico. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer
6

No SQLServer Management Studio:

Tools-> Options-> Designers->Table and Database Designers

Desmarque Prevent saving changes that require table re-creation.

Agora você pode reorganizar a tabela.

vikas Chaturvedi
fonte
2

O servidor SQL constrói internamente o script. Ele cria uma tabela temporária com novas alterações e copia os dados e elimina a tabela atual, em seguida, recria a inserção da tabela a partir da tabela temporária. Eu o encontro na opção "Gerar script de mudança" ssms 2014. Script como este. Daqui : Como alterar a ordem das colunas em uma tabela usando consulta sql

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
Subhankar
fonte
1

Se sua tabela tiver colunas suficientes, você pode tentar isso. Primeiro crie uma nova tabela com a ordem preferencial de colunas.

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

Agora elimine a tabela usando o comando drop

    drop table table_name;

agora renomeie a tabela recém-criada com o nome da tabela antiga.

    rename new to table_name;

agora selecione a tabela, você tem suas colunas reorganizadas como preferia antes.

    select * from table_name;
Hemanth Nukala
fonte
Isso é o mesmo que criar uma nova tabela, copiar dados da tabela existente para a nova, deletar a antiga e renomear a nova. Falando estritamente, isso não muda a ordem das colunas da tabela. Como isso cria / copia a tabela antiga, leva tempo para tabelas grandes. Por último, mas não menos importante, a sintaxe proposta não funciona em t-sql.
Jean-François
0

No final do dia, você simplesmente não pode fazer isso no MS SQL. Recentemente, criei tabelas em movimento (inicialização do aplicativo) usando um procedimento armazenado que lê de uma tabela de pesquisa. Quando criei uma visão que combinava isso com outra tabela que havia criado manualmente antes (mesmo esquema, com dados), ela falhou - simplesmente porque eu estava usando '' Select * UNION Select * 'para a visão. Ao mesmo tempo, se eu usar apenas aqueles criados por meio do procedimento armazenado, terei êxito.

Concluindo: Se existe alguma aplicação que dependa da ordem das colunas, não é uma boa programação e com certeza criará problemas no futuro. As colunas devem 'parecer' livres para estar em qualquer lugar e ser usadas para qualquer processo de dados (INSERT, UPDATE, SELECT).

Chagbert
fonte
0

Você pode conseguir isso com estas etapas:

  1. remova todas as chaves estrangeiras e a chave primária da tabela original.

  2. renomeie a tabela original.

  3. usando CTAS, crie a tabela original na ordem que desejar.

  4. largue a velha mesa.

  5. aplique todas as restrições de volta à tabela original

Ravichandra Aj
fonte
0

Se as colunas a serem reordenadas tiverem sido criadas recentemente e estiverem vazias, então as colunas podem ser excluídas e adicionadas novamente na ordem correta.

Isso aconteceu comigo, estendendo um banco de dados manualmente para adicionar novas funcionalidades, e eu havia perdido uma coluna e, quando a adicionei, a sequência estava incorreta.

Depois de encontrar nenhuma solução adequada aqui, simplesmente corrigi a tabela usando o seguinte tipo de comandos.

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

Nota: só faça isso se você não tiver dados nas colunas que está descartando.

As pessoas disseram que a ordem das colunas não importa. Eu regularmente uso o SQL Server Management Studio para "gerar scripts" para criar uma versão de texto do esquema de um banco de dados. Para controlar de forma eficaz a versão desses scripts (git) e compará-los (WinMerge), é imperativo que a saída de bancos de dados compatíveis seja a mesma e as diferenças destacadas são diferenças genuínas de banco de dados.

A ordem das colunas é importante; mas apenas para algumas pessoas, não para todos!

Ivan
fonte
0

Suponho que você deseja adicionar uma nova coluna em uma posição específica. Você pode criar uma nova coluna movendo as colunas atuais para a direita.

+---+---+---+
| A | B | C |
+---+---+---+

Remova todos os índices afetados e referências de chave estrangeira. Adicione uma nova coluna com exatamente o mesmo tipo de dados da última coluna e copie os dados para lá.

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

Altere o tipo de dados da terceira coluna para o mesmo tipo da coluna anterior e copie os dados para lá.

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

Renomeie colunas de acordo, recrie índices removidos e referências de chave estrangeira.

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

Altere o tipo de dados da segunda coluna.

Lembre-se de que a ordem das colunas é apenas uma coisa "cosmética", como marc_s disse .

Václav Dajbych
fonte
-1

Usar

SELECT * FROM TABLE1

que exibe a ordem padrão das colunas da tabela.

Se você deseja alterar a ordem das colunas.

Especifique o nome da coluna para exibir de forma correspondente

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
Solairaja
fonte
A questão não é sobre pedidos temporários. A questão é sobre a estrutura de design da tabela quando você altera a tabela e adiciona novas colunas.
vikas Chaturvedi
-1

você pode usar a indexação .. Após a indexação, se selecionar * de XXXX os resultados devem estar de acordo com o índice, mas apenas o conjunto de resultados .. não estrutura da Tabela

Karthik.M
fonte
-1

Você pode alterar isso usando consulta SQL. Aqui está a consulta sql para alterar a sequência da coluna.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
Aashay Shah
fonte
Eu me pergunto se isso descarta e recria a tabela como no SSMS. De qualquer forma, eu não jogaria os dados fazendo isso em um banco de dados de produção, embora esse método pareça interessante e valha a pena ser investigado.
samis
Essa funcionalidade não funciona no SQL Server conforme especificado pelo OP. Queria que sim.
Bill
1
Esta é a sintaxe do MySQL, não do SQL Server.
Jon Schneider
-1

Para ter uma ordem de coluna específica, você precisa selecionar coluna por coluna na ordem que desejar. A ordem de seleção determina como as colunas serão ordenadas na saída.

Nauris Krūmiņš
fonte
-1

Tente este comando:

alter table students modify age int(5) first; 

Isso mudará a posição da idade para a primeira posição.

Mwavu Rogers
fonte
Este não é um SQL válido no MSSQL. Talvez MySQL ou algum outro dialeto, mas não para SQL Server 2005
nsimeonov
-2

altere o nome da tabela modifique o nome da coluna int (5) primeiro; trará a coluna para primeiro alterar o nome da tabela modificar nome da coluna int (5) após (nome da tabela);

Farhan Sait
fonte
-3

Exemplo: alterar a posição de field_priority após field_price no status da tabela.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;
Lecaoquochung
fonte
2
Esta é a sintaxe do MySQL, não do SQL Server.
Jon Schneider