Posso reordenar logicamente as colunas em uma tabela?

93

Se eu estiver adicionando uma coluna a uma tabela no Microsoft SQL Server, posso controlar onde a coluna é exibida logicamente nas consultas?

Não quero mexer com o layout físico das colunas do disco, mas gostaria de agrupar logicamente as colunas, quando possível, para que ferramentas como o SQL Server Management Studio listem o conteúdo da tabela de maneira conveniente.

Eu sei que posso fazer isso por meio do SQL Management Studio entrando em seu modo de "design" para tabelas e arrastando a ordem das colunas, mas gostaria de poder fazer isso em SQL bruto para poder realizar a ordenação com script da linha de comando.

fastcall
fonte
Tarde demais para uma resposta, mas dê uma olhada neste link. blog.sqlauthority.com/2013/03/11/…
sqluser
e outra pergunta relacionada, sobre se é importante stackoverflow.com/questions/6692021/…
Tim Abell
microsoft connect: sintaxe ALTER TABLE para alterar a ordem das colunas - a resposta é da variedade de bule de chocolate, como de costume WONTFIX
Tim Abell

Respostas:

77

Você não pode fazer isso programaticamente (de uma forma segura) sem criar uma nova tabela.

O que o Enterprise Manager faz quando você confirma uma reordenação é criar uma nova tabela, mover os dados e então excluir a tabela antiga e renomear a nova tabela com o nome existente.

Se você deseja que suas colunas estejam em uma ordem / agrupamento específico sem alterar sua ordem física, você pode criar uma visualização que pode ser o que você desejar.

vzczc
fonte
43

Acho que o que está faltando a todos aqui é que, embora nem todos tenham que lidar com instâncias de 10, 20 ou 1000 do mesmo sistema de software instalado em todo o país e no mundo ... aqueles de nós que projetam software vendido comercialmente o fazem. Como resultado, expandimos os sistemas ao longo do tempo, expandimos as tabelas adicionando campos conforme um novo recurso é necessário e, conforme esses campos são identificados, pertencem a uma tabela existente e, como tal, mais de uma década de expansão, crescimento, adição de campos, etc. às tabelas ... e então ter que trabalhar com essas tabelas desde o design, até o suporte, às vezes cavando em dados brutos / solução de problemas para depurar novos bugs de funcionalidade ... é incrivelmente agravante não ter as informações primárias que você deseja veja dentro do primeiro punhado de campos,

Muitas vezes desejei poder fazer isso, exatamente por esse motivo. Mas, sem fazer exatamente o que o SQL faz, construir um script de criação para uma nova tabela da maneira que eu quero, escrever o Insert nela e, em seguida, eliminar todas as restrições existentes, relacionamentos, chaves, índice, etc etc etc da tabela existente e renomear a "nova" tabela de volta ao nome antigo e, em seguida, lendo todas as chaves, relacionamentos, índice, etc etc ....

Não é apenas tedioso, demorado, mas ... em mais cinco anos, precisará acontecer novamente ....

É tão perto de valer a pena essa enorme quantidade de trabalho, no entanto, o ponto é ... não será a última vez que precisaremos dessa capacidade, já que nossos sistemas continuarão a crescer, expandir e obter campos em uma ordem maluca conduzida por necessidade / design adições.

A maioria dos desenvolvedores pensa do ponto de vista de um único sistema que atende a uma única empresa ou a um mercado de caixas rígidas muito específico.

Os designers e líderes de desenvolvimento "prontos para uso", mas significativamente progressivos em seu espaço de mercado, sempre terão que lidar com esse problema, continuamente ... adorariam uma solução criativa, se houver algum. Isso poderia facilmente economizar para minha empresa uma dúzia de horas por semana, simplesmente não tendo que rolar ou lembrar onde "aquele" campo está na tabela de dados de origem ....

Philip Coyner
fonte
Tivemos o mesmo problema e criamos um procedimento armazenado que automatiza esse processo (renomear, criar uma nova tabela, copiar, recriar todas as chaves estrangeiras, restrições, etc.). Você só precisa passar o nome da tabela e a nova ordem das colunas. Se isso pudesse realmente economizar dezenas de horas por semana para sua empresa, você deveria investir tempo escrevendo um script semelhante. Para nós, levou apenas 2-3 dias para ter um script estável que usamos rotineiramente para reordenar colunas. Ele cuida de todos os recursos que usamos no SqlServer (por exemplo, índices parciais, visualizações indexadas, etc) e consiste em apenas cerca de 400 LOC.
Andreas,
Não sei por que eles não conseguem abstrair o layout da coluna de alguma forma. Não é necessário reordenar fisicamente as colunas! A quantidade de nível de PHD e além da engenharia no Sql Server é verdadeiramente surpreendente. Quando você considera a complexidade da geração do plano de consulta, as estatísticas, a indexação e ninguém se levantou ainda e disse 'Vamos apenas fazer uma tabela que representa a ordem LÓGICA. FieldID Guid, OrderBy int. Feito. Então SSMS ou SELECT *usa isso. Desligue-o se você for um DBA perfeito e não quiser. Muito frustrante. E agora minhas mesas são grandes o suficiente para que eu não possa mais usar força bruta.
Simon_Weaver
Eu sei que este é um comentário antigo, mas o visual studio dentro do projeto de banco de dados cria automaticamente o script SQL para reordenar a coluna física quando você altera o esquema da tabela e clica em publicar.
Muflix
5

Se entendi sua pergunta, você quer afetar o que as colunas são retornadas primeiro, segundo, terceiro, etc em vigor consultas , certo?

Se todas as suas consultas forem escritas com SELECT * FROM TABLE - então elas aparecerão na saída conforme são apresentadas no SQL.

Se suas consultas são escritas com SELECT Field1, Field2 FROM TABLE- então a ordem em que são apresentadas no SQL não importa.

Otto
fonte
3

Quando o Management Studio faz isso, ele está criando uma tabela temporária, copiando tudo, descartando sua tabela original e renomeando a tabela temporária. Não existe uma instrução T-SQL equivalente simples.

Se você não gosta de fazer isso, pode sempre criar uma visualização da tabela com as colunas na ordem que deseja e usar?

Editar: derrotado!

tags2k
fonte
1

Existe uma maneira, mas é apenas temporariamente para a própria consulta. Por exemplo,

Digamos que você tenha 5 mesas. Tabela é chamadaT_Testing

FirstName, LastName, PhoneNumber, Email e Member_ID

você deseja que ele liste o ID, o sobrenome, o nome, o telefone e o e-mail.

Você pode fazer isso de acordo com o Select.

Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing

Além disso, se você quiser apenas que o sobrenome apareça antes do nome por algum motivo, você também pode fazer da seguinte maneira:

Select LastName, *
From T_Testing

A única coisa que você quer ter certeza de fazer é que a função OrderBy ou Where precisa ser denotada como Table.Column se você for usar um Where ou OrderBy

Exemplo:

Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc

Espero que isso ajude, descobri porque precisava fazer isso sozinho.

Steven
fonte
Nesta consulta, selecione LastName, * Em T_Testing, você obtém LastName duas vezes.
sqluser de
1
  1. Crie um script de sua tabela existente para uma janela de consulta.
  2. Execute este script em um banco de dados de teste (remova a instrução Use)
  3. Use SSMS para fazer as alterações de coluna de que você precisa
  4. Clique em Generate Change Script (ícone mais à esquerda e mais abaixo na barra de botões, por padrão)
  5. Use este script contra sua mesa real

Tudo o que o script realmente faz é criar uma segunda tabela de tabela com as ordens de coluna desejadas, copiar todos os seus dados nela, descartar a tabela original e, em seguida, renomear a tabela secundária para ocupar seu lugar. Isso evita que você o escreva sozinho, se quiser um script de implantação.

Paulo
fonte
0

Isso pode ser feito usando SQL, modificando as tabelas do sistema diretamente. Por exemplo, veja aqui:

Alterar tabela - Adicionar nova coluna entre

No entanto, eu não recomendaria jogar com tabelas de sistema, a menos que seja absolutamente necessário.

Milan Babuškov
fonte
0

Não é possível alterar a ordem das colunas sem recriar a tabela inteira. Se você tiver apenas algumas instâncias do banco de dados, pode usar o SSMS para isso (selecione a tabela e clique em "design").

Caso você tenha muitas instâncias para um processo manual, você deve tentar este script: https://github.com/Epaminaidos/reorder-columns

Andreas
fonte