Listar campos da tabela que fazem parte da chave primária
Pessoal,
estou precisando saber uma forma de [b:8ccdf851f7]listar as colunas que compoem[/b:8ccdf851f7] 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
estou precisando saber uma forma de [b:8ccdf851f7]listar as colunas que compoem[/b:8ccdf851f7] 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
Lucmarcio
Curtidas 0
Respostas
Marcus.magalhaes
28/04/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,
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,
GOSTEI 0
Lucmarcio
28/04/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,
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,
GOSTEI 0
Emerson Nascimento
28/04/2005
tente com essa instrução:
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
GOSTEI 0
Emerson Nascimento
28/04/2005
ou, como você solicitou, especificando os campos:
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
GOSTEI 0
Lucmarcio
28/04/2005
Obrigado a todos que ajudaram.
Valeu Emerson
Valeu Marcus
Valeu Emerson
Valeu Marcus
GOSTEI 0