none
Identificar todos os indices RRS feed

  • Pergunta

  • Pessoal

        Qual seria a melhor maneira de identificar todos os indices menos as primary, de um banco de dados qualquer, em sql server 2000 ?

    select 
    tb_sys_idx.name as nm_Indice
    ,tb_sys_tab.name as nm_Tabela
    ,tb_sys_col.name as nm_Coluna
    ,substring(tb_sys_idx.name,1,2) as pk_key
    from nucleu_base.dbo.sysobjects tb_sys_tab
    inner join nucleu_base.dbo.sysindexes tb_sys_idx
    on tb_sys_tab.id = tb_sys_idx.id 
    inner join nucleu_base.dbo.sysindexkeys tb_sys_idx_col
    on tb_sys_idx.id = tb_sys_idx_col.id
    and tb_sys_idx.indid = tb_sys_idx_col.indid 
    inner join nucleu_base.dbo.syscolumns tb_sys_col
    on tb_sys_idx.id = tb_sys_col.id 
    and tb_sys_idx_col.colid = tb_sys_col.colid
    where tb_sys_tab.xtype = 'U'
    and tb_sys_idx.indid between 1 and 254
    and substring(tb_sys_idx.name,1,3) <> 'pk_'

    terça-feira, 9 de setembro de 2014 15:02

Respostas

  • Neibala,

    Você vai precisar indicar o banco de dados no início do script, pois estas tabelas de sistema apenas irão apontar objetos referentes a cada banco de dados. Segue o script alterado:

    USE SeuBanco
    GO
    
    select 
    tb_sys_idx.name as nm_Indice
    ,tb_sys_tab.name as nm_Tabela
    ,tb_sys_col.name as nm_Coluna
    ,substring(tb_sys_idx.name,1,2) as pk_key, *
    from dbo.sysobjects tb_sys_tab
    inner join dbo.sysindexes tb_sys_idx
    on tb_sys_tab.id = tb_sys_idx.id 
    inner join dbo.sysindexkeys tb_sys_idx_col
    on tb_sys_idx.id = tb_sys_idx_col.id
    and tb_sys_idx.indid = tb_sys_idx_col.indid 
    inner join dbo.syscolumns tb_sys_col
    on tb_sys_idx.id = tb_sys_col.id 
    and tb_sys_idx_col.colid = tb_sys_col.colid
    where tb_sys_tab.xtype = 'U'
    and tb_sys_idx.indid between 1 and 254
    and objectproperty(object_id(tb_sys_idx.name),'IsPrimaryKey') is null
    GO

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms190324.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    terça-feira, 9 de setembro de 2014 19:59
    Moderador

Todas as Respostas

  • Pessoal

    Pesquisando um pouco mais com calma, acabei fazendo o código abaixo, só que estou acessando outra base, existiria alguma maneira de utilizar a função objectproperty, object_id utilizando banco e dbo, para ele saber qual é o banco correto ?

    select 
    tb_sys_idx.name as nm_Indice
    ,tb_sys_tab.name as nm_Tabela
    ,tb_sys_col.name as nm_Coluna
    ,substring(tb_sys_idx.name,1,2) as pk_key
    from nucleu_base.dbo.sysobjects tb_sys_tab
    inner join nucleu_base.dbo.sysindexes tb_sys_idx
    on tb_sys_tab.id = tb_sys_idx.id 
    inner join nucleu_base.dbo.sysindexkeys tb_sys_idx_col
    on tb_sys_idx.id = tb_sys_idx_col.id
    and tb_sys_idx.indid = tb_sys_idx_col.indid 
    inner join nucleu_base.dbo.syscolumns tb_sys_col
    on tb_sys_idx.id = tb_sys_col.id 
    and tb_sys_idx_col.colid = tb_sys_col.colid
    where tb_sys_tab.xtype = 'U'
    and tb_sys_idx.indid between 1 and 254
    and objectproperty(object_id(tb_sys_idx.name),'IsPrimaryKey') is null
    

    terça-feira, 9 de setembro de 2014 15:25
  • Neibala,

    Você vai precisar indicar o banco de dados no início do script, pois estas tabelas de sistema apenas irão apontar objetos referentes a cada banco de dados. Segue o script alterado:

    USE SeuBanco
    GO
    
    select 
    tb_sys_idx.name as nm_Indice
    ,tb_sys_tab.name as nm_Tabela
    ,tb_sys_col.name as nm_Coluna
    ,substring(tb_sys_idx.name,1,2) as pk_key, *
    from dbo.sysobjects tb_sys_tab
    inner join dbo.sysindexes tb_sys_idx
    on tb_sys_tab.id = tb_sys_idx.id 
    inner join dbo.sysindexkeys tb_sys_idx_col
    on tb_sys_idx.id = tb_sys_idx_col.id
    and tb_sys_idx.indid = tb_sys_idx_col.indid 
    inner join dbo.syscolumns tb_sys_col
    on tb_sys_idx.id = tb_sys_col.id 
    and tb_sys_idx_col.colid = tb_sys_col.colid
    where tb_sys_tab.xtype = 'U'
    and tb_sys_idx.indid between 1 and 254
    and objectproperty(object_id(tb_sys_idx.name),'IsPrimaryKey') is null
    GO

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms190324.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    terça-feira, 9 de setembro de 2014 19:59
    Moderador