Array
(
)

Listar campos da tabela que fazem parte da chave primária

Lucmarcio
   - 28 abr 2005

Pessoal,
estou precisando saber uma forma de listar as colunas que compoem uma chave primária de uma tabela utilizando as consultas nas tabelas ´SYS´ do SQL Server.

Estou precisando alterar o COLLATE de cada coluna e para isso pretendo a consulta juntamente com a consulta na syscolumns, pois para campos chave esta ocorrendo erro de violação de constraint, usando o comando exemplo:

alter table BAIXAGER alter column BXG_USUARIO_BAIXA varchar(40) COLLATE Latin1_general_CI_AI

Tem alguma forma melhor de alterar o COLLATE do atributo da tabela ou preciso realmente passar por cada coluna, se tiver alguém pode dar uma dica.

Grato,

Luciano Márcio
Belo Horizonte

Marcus.magalhaes
   - 28 abr 2005

Boa tarde.

Precisa passar por cada coluna, o q vc pode fazer é usar um select para montar o seu alter table. Ex.:

Select ´alter table ´ + so.name + ´ alter column ´ + sc.name ´.......´
From sysobjects so Inner Join syscolumns sc On so.id = sc.id
Where condição.

Espero ter ajudado.

Att,

Lucmarcio
   - 28 abr 2005

Isso mesmo Marcus,

Já tenho uma estrutura para pegar estes campos mas preciso retirar os que pertencem a chave primária, pois não consigo executar o ALTER TABLE nesta condição e para os outros campos preciso fazer um ´NOT IN´ para eliminar estes campos.

olha o script abaixo

declare @collate_novo varchar(50)
declare @tabela varchar(50)
declare @coluna varchar(50)
declare @tipo varchar(50)
declare @comando varchar(100)
declare @tamanho integer
declare @pos integer

declare cur_col cursor for
select so.name, sc.name, st.name, sc.length
from sysobjects so
inner join syscolumns sc on so.id = sc.id
inner join systypes st On sc.xtype = st.xtype
where not so.name like ´dt¬´ and not so.name like ´sys¬´ and so.type = ´U´

set @collate_novo = ´Latin1_general_CI_AI´;

open cur_col
fetch cur_col into @tabela, @coluna, @tipo, @tamanho
while @@fetch_status = 0
begin
select @pos = charindex(´char´, @tipo, 0)
if ( @pos > 0 )
begin
--print ´tabela ´ + @tabela + ´ coluna ´ + @coluna + ´ tipo ´ + @tipo + ´ tamanho ´ + cast(@tamanho as varchar(10)) + ´ charindex = ´ + cast(@pos as varchar(10))
set @comando = ´alter table ´ + @tabela + ´ alter column ´ + @coluna + ´ ´ + @tipo + ´(´ + cast(@tamanho as varchar(10)) + ´) COLLATE ´ + @collate_novo
print @comando
exec(@comando)
end
fetch cur_col into @tabela, @coluna, @tipo, @tamanho
end
close cur_col
deallocate cur_col

Grato,

Emerson
   - 29 abr 2005

tente com essa instrução:

#Código

select * from sysobjects so
inner join sysindexes si on (si.id=so.parent_obj and si.indid=so.uid)
inner join sysindexkeys sik on (sik.id=si.id and sik.indid=si.indid)
inner join syscolumns sc on (sc.id=so.parent_obj and sc.colid=sik.colid)
where objectproperty(so.id, N´IsPrimaryKey´)=1 
  and objectproperty(so.parent_obj, N´IsUserTable´)=1
  and not object_name(so.parent_obj) like ´dt¬´
order by so.id, sik.keyno


Emerson
   - 29 abr 2005

ou, como você solicitou, especificando os campos:

#Código

select so.name, sc.name, sc.length from sysobjects so
inner join sysindexes si on (si.id=so.parent_obj and si.indid=so.uid)
inner join sysindexkeys sik on (sik.id=si.id and sik.indid=si.indid)
inner join syscolumns sc on (sc.id=so.parent_obj and sc.colid=sik.colid)
where objectproperty(so.id, N´IsPrimaryKey´)=1 
  and objectproperty(so.parent_obj, N´IsUserTable´)=1
  and not object_name(so.parent_obj) like ´dt¬´
order by so.id, sik.keyno


Lucmarcio
   - 29 abr 2005

Obrigado a todos que ajudaram.

Valeu Emerson

Valeu Marcus