none
Procedure retornando valores de varios select's RRS feed

  • Pergunta

  • Tenho que contar linhas de várias tabelas, e resolvi fazer os select's na mesma procedure.

    Ex.: select count(*) as cont1 from tbl1

    select count(*) as cont2 from tbl2

    select count(*) as cont3 from tbl3

    select count(*) as cont4 from tbl4

     

    mas está dando errado!

    alguem pode me ajudar?

    terça-feira, 1 de junho de 2010 15:39

Respostas

  • Leticia, crie uma tabela temporátia ou uma variavel "table" com 4 campos ou com 1 campo mesmo, faça o insert do resultado desse Count nessa tabela e ao final faça um select da tabela temporária para o retorno da proc.

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    • Marcado como Resposta LeticiaAmorim quarta-feira, 2 de junho de 2010 14:10
    terça-feira, 1 de junho de 2010 17:00
  • Galera.. resolvii...

     agradeço a colaboração de todos!!

    Esse select monta uma linha com cada select que eu preciso organizado em uma coluna.

    Pode não ser a melhor forma, mas resolveu meu problema!!

     

    **Valeu FAUSTOOO eu tentei fazer uma temporaria, mas achei essa solução aí!

     

    SELECT

    (

    SELECT 

    count(*)

    FROM

    tabela1

    WHERE

    cod = @cod1

    ) as contTabela1,

    (

    SELECT 

    count(*)

    FROM

    tabela2

    WHERE

    cod = @cod2

    ) as contTabela2,

    (

    SELECT 

    count(*)

    FROM

    tabela3

    WHERE

    cod = @cod3

    ) as contTabela3,

    (

    SELECT 

    count(*)

    FROM

    tabela4

    WHERE

    cod = @cod4

    ) as contTabela4,

    (

    SELECT 

    count(*)

    FROM

    tabela5

    WHERE

    cod = @cod5

    ) as contTabela5,

    (

    SELECT 

    count(*)

    FROM

    tabela6

    WHERE

    cod = @cod6

    ) as contTabela6

    • Marcado como Resposta LeticiaAmorim quarta-feira, 2 de junho de 2010 14:10
    quarta-feira, 2 de junho de 2010 14:09

Todas as Respostas

  • Leticia, crie uma tabela temporátia ou uma variavel "table" com 4 campos ou com 1 campo mesmo, faça o insert do resultado desse Count nessa tabela e ao final faça um select da tabela temporária para o retorno da proc.

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    • Marcado como Resposta LeticiaAmorim quarta-feira, 2 de junho de 2010 14:10
    terça-feira, 1 de junho de 2010 17:00
  • Se for no SQL Server 2005 ou 2008, tente rodar essa query abaixo que retorna a quantidade de registro de uma tabela:

    SELECT t.[name], p.[rows]

    FROM

     

    sys.schemas s

     

    INNER JOIN sys.tables t ON t.[schema_id] = s.[schema_id]

     

    INNER JOIN sys.indexes i ON i.[object_id] = t.[object_id] AND i.[type] IN (0,1)

     

    INNER JOIN sys.partitions p ON p.[object_id] = t.[object_id] AND p.[index_id] = i.[index_id]

    where

     

    t.name in ('tbl1','tbl2','tbl3','tbl4')

    ORDER

     

    BY p.[rows] desc


    Fabrício França Lima | MCP, MCTS, MCITP | Visite meu site: http://fabriciodba.spaces.live.com/
    terça-feira, 1 de junho de 2010 17:35
  • Fabricio, depende muito das permissões de usuário para poder ler as tabelas/views de sistema. Levando em conta sempre o cenário mais restritivo, um usuario utilizado por um sistema/site para acesso ao banco nunca deveria ter acesso a estas tabelas/views .

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    terça-feira, 1 de junho de 2010 18:00
  • Letícia,

    Vamos ser mais práticos, qual é o erro?

    Talvez criar um procedure para isso poderá ser desnecessário, mas vamos analisar!!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 1 de junho de 2010 18:01
  • Fala Fausto, é que não foi dito onde seria utilizado...

    Se ela for a Administradora de lá e ela mesma precisa obter essa informação, vizualizar nos metadados seria menos custoso...

    Mas é como vc disse, depende do usuário que executará as procedures e onde o procedimento será utilizado.

     


    Fabrício França Lima | MCP, MCTS, MCITP | Visite meu site: http://fabriciodba.spaces.live.com/
    terça-feira, 1 de junho de 2010 18:16
  • Galera.. é o seguinte..

     

    eu to fazendo um sistema de tombo.

     

    Que guarda os registros das tabelas, em tabelas de historico.

     

    O usuário do sistema tem que ver uma tabela com as seguintes colunas.

    Nome da tabela, qtd de linhas, tombar, limpar.

    são 12 tabelas, e eu preciso retornar o número de linhas para que o usuario veja quantas linhas tem a tabela que ele quer tombar.

     

    Acredito que a ideia da tabela temporaria é boa, mas se alguem tiver alguma outra...

     

    ***Eu queria saber porque a minha prc não funciona tbm!

    terça-feira, 1 de junho de 2010 18:41
  • Letícia,

    Entendi a sua necessidade, mas qual é a mensagem de erro que o SQL Server esta retornando?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    terça-feira, 1 de junho de 2010 18:52
  • alguma coisa com request number ordinal...
    terça-feira, 1 de junho de 2010 19:09
  • Olá Leticia,

    Veja se o código abaixo ajuda.

    SELECT TABELA='TABELA_A', COUNT(1) FROM TABELA_A
    UNION ALL
    SELECT TABELA='TABELA_B', COUNT(1) FROM TABELA_B

     

     

    []s


    asc
    terça-feira, 1 de junho de 2010 22:15
  • Leticia, o assundo pode não ser o mesmo, mas tem algums pontos que podem te ajudar:

    http://faustobranco.spaces.live.com/blog/cns!5EA93520A3B2FB10!2235.entry

    http://faustobranco.spaces.live.com/Blog/cns!5EA93520A3B2FB10!2233.entry


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    quarta-feira, 2 de junho de 2010 11:26
  • Letícia,

    Você poderia postar toda a estrutura do seu código e mensagem de erro?

    Sem esses detalhes fica complicado ajudar, senão vamos ficar enchendo este post de respostas desnecessárias.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    quarta-feira, 2 de junho de 2010 12:42
  • SELECT 
    count(*) as contTabela1
    FROM
    tabela1
    WHERE
    cod = @cod1

    SELECT 
    count(*) as contTabela2
    FROM
    tabela2
    WHERE
    cod = @cod2

    SELECT 
    count(*) as contTabela3
    FROM
    tabela3
    WHERE
    cod = @cod3

    SELECT 
    count(*) as contTabela4
    FROM
    tabela4
    WHERE
    cod = @cod4

    SELECT 
    count(*) as contTabela5
    FROM
    tabela5
    WHERE
    cod = @cod5
    SELECT 
    count(*) as contTabela6
    FROM
    tabela6
    WHERE
    cod = @cod6

    Aparece o seguinte erro:

    ADODB.Recordset error '800a0cc1'

    Item cannot be found in the collection corresponding to the requested name or ordinal.

    Na página eu tenho apenas rs("contTabela1"),rs("contTabela2"),rs("contTabela3") ...

    Os selects na procedure são assim mesmo, um abaixo do outro, eu rodo no banco e funciona legal!
    Quando eu vou recuperar via asp não aparece.
    Eu apaguei os selects da procedure e deixei apenas um, e não obtive erro na página, o número de linhas apareceu normalmente.

    quarta-feira, 2 de junho de 2010 13:10
  • Era por isso que eu comentei para colocar tudo em uma tabela temporaria e retornar um unico select. O recordset não vai funcionar para varios retornos de selects distintos em uma unica chamada de SP.

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    quarta-feira, 2 de junho de 2010 13:46
  • Galera.. resolvii...

     agradeço a colaboração de todos!!

    Esse select monta uma linha com cada select que eu preciso organizado em uma coluna.

    Pode não ser a melhor forma, mas resolveu meu problema!!

     

    **Valeu FAUSTOOO eu tentei fazer uma temporaria, mas achei essa solução aí!

     

    SELECT

    (

    SELECT 

    count(*)

    FROM

    tabela1

    WHERE

    cod = @cod1

    ) as contTabela1,

    (

    SELECT 

    count(*)

    FROM

    tabela2

    WHERE

    cod = @cod2

    ) as contTabela2,

    (

    SELECT 

    count(*)

    FROM

    tabela3

    WHERE

    cod = @cod3

    ) as contTabela3,

    (

    SELECT 

    count(*)

    FROM

    tabela4

    WHERE

    cod = @cod4

    ) as contTabela4,

    (

    SELECT 

    count(*)

    FROM

    tabela5

    WHERE

    cod = @cod5

    ) as contTabela5,

    (

    SELECT 

    count(*)

    FROM

    tabela6

    WHERE

    cod = @cod6

    ) as contTabela6

    • Marcado como Resposta LeticiaAmorim quarta-feira, 2 de junho de 2010 14:10
    quarta-feira, 2 de junho de 2010 14:09