Adicionar uma nova coluna da tabela para a posição ordinal específico no Microsoft SQL Server

StackOverflow https://stackoverflow.com/questions/769828

Pergunta

É possível adicionar uma coluna a uma mesa em uma posição ordinal específico no Microsoft SQL Server?

Por exemplo, nossas mesas sempre tem CreatedOn, CreatedBy, LastModifiedOn, colunas LastModifiedBy no "fim" de cada definição de tabela? Eu gostaria que a nova coluna para mostrar-se em SSMS acima dessas colunas.

Se estou script todas as minhas alterações de banco de dados, há uma maneira de preservar essa ordem no final da tabela?

FYI, eu não estou tentando instituir uma guerra em se este deve mesmo ser feito. Se você quiser ler sobre um segmento que degenera rapidamente para que, aqui está um bom:

http://www.developersdex.com/sql/message. asp? p = 581 & r = 5014513

Foi útil?

Solução

Você tem que criar uma tabela temporária que esquema espelhos da tabela original, mas com a ordem das colunas que você quer, em seguida, copie o conteúdo do original para Temp. Excluir o original e mudar o nome da temperatura.

Este é o SQL Management Studio faz nos bastidores.

Com uma ferramenta de esquema de sincronização, você pode gerar esses scripts automaticamente.

Outras dicas

entrar em SQL Server Management Studio, e "design" uma tabela existente. Inserir uma coluna no meio, clique direito em uma área vazia e selecione Gerar Mudança Script ...

Agora olhe para o script que ele cria. ele vai basicamente criar uma tabela de temperatura com o fim de coluna adequada, inserir os dados da tabela original, gota a tabela original, e mude a tabela temporária. Este é provavelmente o que você precisa fazer.

 enter descrição da imagem aqui

Você também pode precisar de desmarcar esta opção para permitir a criação de scripts de alteração

 enter descrição da imagem aqui

A resposta é sim, é tecnicamente possível, mas você vai ter uma dor de cabeça fazê-lo e ele vai levar um longo tempo para executar e configurar.

Um: Criar / Copiar / Drop / Rename

Este é realmente o que SQL Server está fazendo na interface gráfica: aqui está um exemplo do script está gerando e executando quando você clica no botão 'salvar' depois de adicionar uma nova coluna para o início de uma mesa.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
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_SomeTable
    (
    MyNewColumn int NOT NULL,
    OriginalIntColumn int NULL,
    OriginalVarcharColumn varchar(100) NULL
    )  ON [PRIMARY]
     TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
     EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO

GO
COMMIT

Two: ADD COLUMN / UPDATE / DROP COLUMN / RENAME

Este método basicamente envolve a criação de uma cópia de quaisquer colunas existentes que você deseja adicionar ao 'direito' de sua nova coluna, transferir os dados para a nova coluna, em seguida, deixando cair os originais e renomeando os novos. Este vai jogar estragos com quaisquer índices ou restrições que você tem, pois você tem que repoint eles. É tecnicamente possível, mas, novamente, tanto em termos de desenvolvimento e execução demorada.

CREATE TABLE MyTest (a int, b int, d int, e int)

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)

SELECT * FROM MyTest -- your current table

ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns

ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample

Três: viver com ele

Este poderosamente ofende meu senso de ordem ... mas às vezes, ele simplesmente não vale a pena remanejamento.

Para o meu conhecimento não há nenhum método conhecido para alterar a ordem da coluna. Nos bastidores SQL Management Studio faz o que José Basilio disse. E se você tem uma grande mesa, em seguida, é impraticável para alterar as ordens de colunas como esta forma.

Você pode usar uma "visão". Com SQL vê você pode usar qualquer ordem que desejar sem ser afetada pelas alterações de coluna da tabela.

TFS 2013 vai fazer isso automaticamente para você .

Adicionar a nova coluna (s) para a sua mesa de qualquer maneira que você gosta, e, em seguida, confirmar as alterações para TFS. De lá você pode abrir o arquivo sql da tabela no Visual Studio e mover manualmente a ordem das colunas na T-SQL CREATE script. Depois, você pode atualizar seu banco de dados de destino usando a ferramenta do VS esquema comparar encontrado em Ferramentas> SQL Server> Novo esquema de comparação. Escolha seu projeto de banco de dados com a alteração como a fonte eo banco de dados que você deseja atualizar como o destino. Compare, selecione roteiro da mesa, e Update. VS vai cair e adicionar automaticamente. Todos os seus dados estarão seguros, e os índices também.

sujo e simples.
tabela de exportação para CSV.
Inserir novos dados na posição desejada.
drop table.
Criar nova tabela com as especificações da coluna desejada.
Carregar colunas de CSV a nova tabela.

O que eu acho que é simples é adicionar a coluna ALTER TABLE table1 ADD .. e, em seguida, criar uma tabela tmp como tmp_table1 da escolha como SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; e depois cair table1 e renomear o tmp_table1 para table1, que é ele. Espero que ele vai ajudar alguém

Não estou certo se o segmento ainda está ativa. Eu estava tendo a mesma consulta com banco de dados MySQL. botão direito do mouse na tabela e selecionando auto 'ALTER' gerou o código abaixo. Exemplo fornecido a partir db sakila e funcionou. Apenas descobrir a coluna após o qual você deseja colocar sua nova coluna e uso 'depois' palavra-chave

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 

Selecionar tudo a coluna na tabela temp, e criar nova tabela com nova coluna que deseja gota a tabela de idade, todos seleccionar a coluna da tabela temporária e a inserção num novo com coluna de reabastecimento. e sem perda de dados

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top