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.
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.
Respostas:
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 TABLE
comando, copiar os dados da tabela antiga e, em seguida, descartá-los.
Não há comando SQL para definir a ordem das colunas.
INSERT
sem especificar explicitamente suas colunas!
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
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
- 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)
- 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.)
- 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" .
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.
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 .
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:
select *
não força as colunas a serem retornadas em uma ordem específicacreate table' or in the
instruções alter table add `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
- - -
No SQLServer Management Studio:
Ferramentas -> Opções -> Designers -> Designers de tabelas e bancos de dados
Então:
O SQLServer Management Studio eliminará a tabela e a recriará usando os dados.
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
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.
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
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;
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).
Você pode conseguir isso com estas etapas:
remova todas as chaves estrangeiras e a chave primária da tabela original.
renomeie a tabela original.
usando CTAS, crie a tabela original na ordem que desejar.
largue a velha mesa.
aplique todas as restrições de volta à tabela original
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!
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 .
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
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`;
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.
Tente este comando:
alter table students modify age int(5) first;
Isso mudará a posição da idade para a primeira posição.
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);
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`;