Como alterar o tipo de dados da coluna no banco de dados SQL sem perder dados

198

Eu tenho o banco de dados SQL Server e acabei de perceber que posso alterar o tipo de uma das colunas de intpara bool.

Como posso fazer isso sem perder os dados que já foram inseridos nessa tabela?

Ivan Stoyanov
fonte
3
Você tentou criar uma nova coluna de bits, copiando os valores da coluna antiga para a nova, excluindo a antiga e renomeando a nova? Tudo isso em uma transação, é claro, para reverter problemas.
Radu Caprescu
2
Você diz "Acabei de perceber que posso alterar o tipo de uma das colunas de int para bool". Não há tipo de dados booleano. Há pouco embora. Você está perguntando como você pode fazer isso (como os 2 respostas até agora ter coberto). Ou sua pergunta "Acabei de perceber que isso é possível - como o SQL Server faz isso?"
Martin Smith

Respostas:

329

Você pode fazer isso facilmente usando o seguinte comando. Qualquer valor de 0 será transformado em 0 (BIT = false), qualquer outra coisa será transformada em 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

A outra opção seria criar uma nova coluna do tipo BIT, preenchê-la da coluna antiga e, quando terminar, solte a coluna antiga e renomeie a nova para o nome antigo. Dessa forma, se algo durante a conversão der errado, você sempre poderá voltar, pois ainda possui todos os dados.

marc_s
fonte
10
Em outras palavras: NULLpermanece NULL, 0torna False- se , valores diferentes de zero (1, -1, 1999, -987 ...) tornam-se True.
Álvaro González
2
E nunca faça uma alteração como essa na GUI. Sempre faça isso através de um script como este. A GUI descartará e recriará a tabela e isso consome muito mais tempo. Se a tabela for grande e em produção, isso pode ser desastroso. Além disso, todas as alterações de tabela devem ter um script que esteja no controle de origem, como todos os outros códigos.
HLGEM 21/09
1
Eu acrescentaria, é garantir que você tenha um backup atual do banco de dados antes de fazer qualquer alteração estrutural em uma tabela com dados. E não execute uma alteração como essa na produção durante o horário de pico de uso, se a tabela for frequentemente usada ou grande.
HLGEM 21/09
Aprovei por engano as edições ... preciso rejeitar .. porque não há melhorias lá ... Ans é perfeito.
Vikash Pathak
22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Nota: se houver um tamanho de colunas, basta escrever o tamanho também.

Xyed Xain Haider
fonte
20

Se é uma alteração válida.

você pode alterar a propriedade

Ferramentas -> Opções -> Designers -> Designers de tabela e banco de dados -> Desmarque -> Impedir salvar alterações que exigiram a recriação da tabela.

Agora você pode alterar facilmente o nome da coluna sem recriar a tabela ou perder seus registros.

Sathish
fonte
5
Sob nenhuma circunstância você deve fazer alterações na tabela usando a GUI. Ele recriará completamente a tabela em vez de usar a tabela Alter e isso causará um problema se você desmarcar essa opção e a tabela for grande. Além disso, você deve ter todas as alterações nas tabelas em um script no controle de origem.
HLGEM 21/09
Observe mais de perto essa opção - ela está desativando uma segurança que impedirá a GUI de deixar a mesa cair. Parece que você não perde dados, porque a GUI recriará a tabela, mas no servidor ela será copiada / descartada. Portanto, se houver muitos dados na tabela, isso causará uma operação muito grande. Além disso, acho (não positivo) que isso ocorre em uma única transação; portanto, você pode preencher seu log de transações.
JMarsch 17/10
1
Acho que gostaria de acrescentar um pouco de esclarecimento ao meu comentário anterior. Se você está apenas fazendo isso em sua máquina de desenvolvimento, provavelmente está bem. Mas eu não recomendaria o uso desse método em um banco de dados de produção - especialmente se for de missão crítica.
JMarsch 17/10
8

Por que você acha que vai perder dados? Basta acessar o Management Studio e alterar o tipo de dados. Se o valor existente puder ser convertido em bool (bit), ele fará isso. Em outras palavras, se "1" mapeia para verdadeiro e "0" mapeia para falso em seu campo original, você estará bem.

Philippe Leybaert
fonte
1
Se você tiver dados na tabela, isso não funcionará. Quando você tenta alterar um tipo de coluna, o SMS afirma que precisa soltar a tabela primeiro ... o que obviamente está incorreto, pois o comando ALTER TABLE ... ALTER COLUMN funciona perfeitamente, mesmo em campos que não são NULL. É por isso que eles pensaram que poderiam perder dados.
Tony O'Hagan
1
@ TonyO'Hagan Isso não é verdade. Você pode desativar o aviso e ele funcionará bem com os dados existentes. Veja também stackoverflow.com/questions/2947865/…
Philippe Leybaert 30/04
1
OK legal! Não sabia disso. Apenas tentei votar em você (voltar), mas o SO está me impedindo, a menos que você edite sua resposta. Talvez uma pequena mudança e eu posso fazê-lo;).
Tony O'Hagan
1
Sob nenhuma circunstância você deve fazer alterações na tabela usando a GUI. Ele recriará completamente a tabela em vez de usar a tabela Alter e isso causará um problema se você desmarcar essa opção e a tabela for grande. Além disso, você deve ter todas as alterações nas tabelas em um script no controle de origem.
HLGEM 21/09
Sob nenhuma circunstância. Não há motivo para usar a GUI para projetar tabelas ou alterá-las e boas razões para não fazê-lo. Todas as alterações precisam estar em scripts para poder propagar para outros servidores e tratadas como o código que realmente estão no controle de origem.
HLGEM
5

se você usa T-SQL (MSSQL); você deve tentar este script:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

se você usa MySQL; você deve tentar este script:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

se você usa Oracle; você deve tentar este script:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)
NullException
fonte
3

Vá para Tool-Option-designers-Table e Designers de banco de dados e desmarque a opção Impedir salvarinsira a descrição da imagem aqui

swain saktiprasad
fonte
1
Sob nenhuma circunstância você deve fazer alterações na tabela usando a GUI. Ele recriará completamente a tabela em vez de usar a tabela Alter e isso causará um problema se você desmarcar essa opção e a tabela for grande. Além disso, você deve ter todas as alterações nas tabelas em um script no controle de origem.
HLGEM
2

Altere o tipo de dados da coluna com o tipo de verificação da coluna:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT
Ebrahim Sabeti
fonte
1

pra mim, no sql server 2016, eu faço assim

* Para renomear a coluna Coluna1 para a coluna2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Para modificar o tipo de coluna de string para int :( Verifique se os dados estão no formato correto )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 
MNF
fonte
0

Na edição compacta, o tamanho será automaticamente alterado para o tipo de dados datetime, ou seja, (8), portanto, não é necessário definir o tamanho do campo e gerar erros para esta operação ...

Hardik
fonte
-2

Posso modificar o tipo de dados do campo da tabela, com as seguintes consultas: e também no banco de dados Oracle,

ALTER TABLE table_name
MODIFY column_name datatype;
Ismayil S
fonte
Não está no SQl Server
HLGEM
-4

Substitua o tipo de dados sem perder dados

alter table tablename modify columnn  newdatatype(size);
user7743491
fonte