ADICIONAR COLUNA SQL SERVER

USUARIO.EXCLUIDOS 12/09/2009 15:47:41
#322710
Meu problema e o seguinte.. estou adicionando uma coluna em uma tabela no sql server.
ALTER TABLE tb_produto_ncm ADD
prodescricao VARCHAR(20) NOT NULL
Perfeito ate aqui, so que eu queria que ela entrasse em outra posicao. tipo esse codigo
ALTER TABLE tb_produto_ncm ADD
prodescricao VARCHAR(20) NOT NULL AFTER tb_produto_ncm.proorigem ;
So que pelo que entendi o codigo acima so funciona no mysql.

Alguem sabe como inserir uma coluna na ordem que eu quiser.??


JUNIORISA 14/09/2009 15:44:45
#322832
Tipo naum estou muito bem lembrado mas tenta usar a interface visual do SQL server (se naum me engano é SQL express manager) la da pra fazer estas operações de um modo [Ô]visual[Ô] é bem mais pratico
USUARIO.EXCLUIDOS 14/09/2009 16:18:56
#322844
Junior, em modo visual da para fazer sim, minha questao e a seguinte, tenho 12 base de dados, que vao sofrer alteracoes, vou adicionar campo, alterar proc e mais algumas coisas, entao criei um script para fazer, entao abro o banco e rodo o script. Por isso tinha q conseguir fazer isso via script, entedeu..
EMERSONTADEU 14/09/2009 23:18:25
#322891
Advanced, SQL é ANSI e seus comandos precisam funcionar até em ACCESS ... o que muda são as ferramentas acessórias e algumas funções como getdate que recebe nome diferente mas acabam fazendo a mesma coisa.

Mas vamos ao que interssa, da maneira que quer se não houver uma ferramenta que crie workflow creio que tera que fazer um batch mesmo pois se houverem dados não conheço dentro dos bancos processamento para abrir verticalmente uma tabela e criar.

Se não houverem dados e relacionamentosd obviamente q é fácil, vc pode simplesmente fazer um drop/create mas como a vida sempre é dificil axo que precisará de fazer algo assim:

0 - Faça backup do banco
1 - Cria uma temp tabela na estrutura desejada
2 - Replique toda estrutura possível de chaves e constrains na temp, atenção as tabelas dependentes da temp neste momento ... se criar os consistencia com elas neste momento vai melar seu script
3 - Crie um cursor para incluir registro a registro na tmp (para saber as linhas de eventuais erros)
4 - Se conseguiu validar todos registros agora tente criar as consistencias com tabelas filhas ... talvez precise de cursor para localizar os registros problemáticos, mas se copiou certinho da tabela origem n tem pq dar problema.
5 - Após terminar a importação remova chaves e constrains na tabela origem, cuidado em relacionamentos cascate ou coisas do tipo ... verifique todo relacionamentos diretos para saber as regras.
6 - renomeie a origem para um outro nome e a temp para o nome da origem.

Como disse existem aplicativos que podem auxiliar nisto, mas eu prefiriria ter em forma de script e poder validar passo a passo.

Acredito que talvez este link possa ajuda-lo caso queira tentar o que sugeri ...
http://msdn.microsoft.com/pt-br/library/ms190273.aspx

Uma opção free para SQL seria o OpendbDiff que pode ser encontrado em www.codeplex.com rola em dotnet.
RCMRO 15/09/2009 08:48:18
#322897
Advance,

Só para dar uma de [Ô]Advogado do Diabo[Ô], para que serve INSERIR UMA COLUNA NUMA POSIÇÂO ESPECÍFICA? Principalmente se não vai usar ferramentas gráficas? Não seria um preciosismo que pode gerar mais problemas do que qualquer possibilidade de ser útil.?

Em SQL você extrai dados pela ordem de campos que desejar, principalmente porque em qualquer manual de boas práticas de SQL é quase [Ô]proibido[Ô] usar:
1. [Ô]SELECT * [Ô] --> Usar sempre [Ô]SELECT campo1, campo2, campo3 ....[Ô]
2. [Ô]INSERT INTO tabela SELECT ...[Ô] --> Usar sempre [Ô]INSERT INTO tabela (Campo1, campo2, campo3...) SELECT ...[Ô]
etc...
Ou seja, declarar o nome dos campos é uma regra quase que obrigatória para garantir uma boa programação e, assim, como está a ordem dos campos na tabela passa a ser preciosismo e, portanto, dispensável.

Não me xingue, é só uma opinião.
MARCIO.ROGERIO 15/09/2009 10:36:42
#322914
Resposta escolhida
Olá, conheço um jeito, mas é meio chato, isto é para SQL Server 2000 ou 7.0.

O que determina a order das colunas é a tabela de sistema [i] [syscolumns/i] residente no banco de dados, mas, para poder alterá-la você deve alterar a propriedade do Server Settings, para que possa alterar tabelas de sistema.

Nesta tabela você deve alterar os campos [i] [/icolorder e colid].

Por exemplo, tenho a coluna2 e vou incluir a coluna4, e quero a coluna4 na sequencia da coluna2.

Então, passo o campo colorder da syscolumns da coluna2 para 4, e da coluna4 para 2.

Após, isso passo o campo colid da coluna2 para 5 (é um campo unique), da coluna4 para 2, e novamente da coluna2 para 4.

Feito isto, é necessário realterar a coluna2, conforme ela era, refazer ela do mesmo tipo de dado que ela é.

Vamos dizer que a coluna2 é int not null, então deve-se refazer sua alteração para o mesmo tipo de dado que ela era, ou seja :

alter table tabela
alter column coluna2 int not null.

e pronto a coluna4 vai ficar no lugar da coluna2.

Até,

Rogério.
USUARIO.EXCLUIDOS 15/09/2009 12:18:48
#322927
EMERSONTADEU.
Esse modo ja tinham me falado, mais achei muito trabalho, ter q criar uma temp, validar tudo isso.. e que vou inserir campos em umas 8 tabelas..

RCMRO..rsrs
E que os filtros do meu sistema eu pego da estrutura da base os campos para o cliente escolher, e os ultimos tres de todas as tabelas sao, id_cadastro, id_alteracao, e Data_alteracao.. todas as tabelas terminam assim.. agora eu inserindo esses campos vai sair do layout original e o cliente visualiza isso... ex. nome, contato, endereco id_cadastro, id_alteracao, data_alteracao, numero... entendu.. o numero tinha q estar depois de endereco, para ficar facil dele escolher...

MARCIO ROGERIO
Vou tentar fazer o que vc disse, acredito que vai funcionar, so nao sei se o servidor da locaweb vai deixar eu fazer isso lá.. Valeu
MARCIO.ROGERIO 15/09/2009 12:25:18
#322929
Olá, tome este script de exemplo :

use BancoDados
go

set nocount on

declare @tabela int

drop table teste
create table teste
(coluna1 int not null constraint df_teste_coluna1 default 0,
coluna2 int not null constraint df_teste_coluna2 default 0,
coluna3 int not null constraint df_teste_coluna3 default 0)

alter table teste
add coluna4 int NOT NULL constraint df_teste_coluna4 default 0

insert teste (coluna1,coluna2,coluna3,coluna4) values (1,2,3,4)
insert teste (coluna1,coluna2,coluna3,coluna4) values (11,22,33,44)
insert teste (coluna1,coluna2,coluna3,coluna4) values (111,222,333,444)
insert teste (coluna1,coluna2,coluna3,coluna4) values (1111,2222,3333,4444)
insert teste (coluna1,coluna2,coluna3,coluna4) values (11111,22222,33333,44444)

select * from teste
select * from syscolumns where id = object_id([ô]teste[ô])
set @tabela = object_id([ô]teste[ô])

update syscolumns set colorder = 2 where id = @tabela and name = [ô]coluna4[ô]
update syscolumns set colorder = 4 where id = @tabela and name = [ô]coluna2[ô]
update syscolumns set colid = 5 where id = @tabela and name = [ô]coluna2[ô]
update syscolumns set colid = 2 where id = @tabela and name = [ô]coluna4[ô]
update syscolumns set colid = 4 where id = @tabela and name = [ô]coluna2[ô]
go
alter table teste
alter column coluna2 int not null

select * from teste
select * from syscolumns where id = object_id([ô]teste[ô])

Até,

Rogério.
USUARIO.EXCLUIDOS 15/09/2009 12:43:37
#322934
MARCIO.
* Isso mesmo, o SQL Server 2005 não permite pois as system tables agora trabalham como se fossem views.

Fiz os testes, e realmente ele nao aceita mais alteracoes.
GO
sp_configure [ô]allow updates[ô], 1
GO
RECONFIGURE WITH OVERRIDE
GO

update SysColumns
set colorder = 17
WHERE name = [ô]cliultima_data[ô]

GO
sp_configure [ô]allow updates[ô], 0
GO
RECONFIGURE WITH OVERRIDE
GO

Ate deu o comando dizendo que foi alterado, mas qd fui ver nao tinha..

Blz kara valeu pela ajuda.
USUARIO.EXCLUIDOS 15/09/2009 12:45:20
#322936
QD mandei minha msg. nao tinha visto o script.. vou tentar agora o script..
USUARIO.EXCLUIDOS 15/09/2009 12:57:09
#322940
Testei,
Pelo que vi ele nao permite mesmo..

Como sera que o sql executa no modo designer.., o sql podia dar o script certo??rs.

Vou deixar isso suspenso por enquanto, vou deixar o topico aberto por um tempo, se alguem descobri ficarei grato.

SELECT (RIGHT(TABLE_NAME, LEN(TABLE_NAME) - 3) + [ô].[ô] + RIGHT(COLUMN_NAME, LEN(COLUMN_NAME) - 3)) AS COLUNA, ((TABLE_NAME + [ô].[ô] + COLUMN_NAME) + [ô]-[ô] + DATA_TYPE) AS VALOR FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = [ô]Tb_cliente_enderecos[ô] OR TABLE_NAME = [ô]Tb_cliente_dados[ô] OR TABLE_NAME = [ô]Tb_cliente_telefones[ô]

Esse e o select que executo para listar as tabelas para o cliente escolher o campo para o filtro...

Valeu pela ajuda.
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas