none
Query - Where dinâmico ! RRS feed

  • Pergunta

  • Galera, seguinte...

    Tenho a query abaixo:

     

    ALTER   Procedure isp_getRss
         @cat char
    AS
    Select Top 10 n.cod, n.titulo, c.conteudo, n.dtPub
    From tbl_news n
     Join tbl_conteudo c On n.cConteudo = c.cod
    Where n.dtPub <= getDate() And n.status = 1 And n.cCategoria in (@cat)
    Order By n.dtPub Desc, n.cod Desc

     

    --isp_getRss '0,1,3'

     

    Então amigos, vocês que são feras em Transact-Sql poderão me ajudar...

     

    Deu pra entender que eu quero retornar todas as linhas que o código da categoria "n.cCategoria", que pode conter vários, 0, 1, 3, 4, 5, 6 e por ai vai, entende?

     

    Se eu quisesse selecionar por exemplo as notícias da categoria "0", "3", "6" por exemplo teria que fazer:

    Where n.cCategoria = 0 Or n.cCategoria = 3  Or n.cCategoria = 6

    Só que primeiro não sei se essa é a melhor forma, segundo em meu cenário não funcionará corretamente, porque esses parâmetros depende das categorias que o usuário selecionou em um CheckBoxList e queria passar por um parâmetro só...

     

    Alguém sabe como eu faço esse Where dinâmico? Tipo, o jeito que tá ai, funciona, passo um char pra uma coluna int, mas ele só pega o primeiro número, o antes da primeira virgula... e as outras categorias são iguinoradas, mas também não dá erro.

     

    Mas eu acho que tem um solução pra esse problema, sem ser utilizar query em varchar e depois utilizar o comando "EXEC" para executa-la....

     

     

    Alguém pode me ajudar?

     

    Desde já grato!

     

    quarta-feira, 27 de setembro de 2006 19:28

Respostas

  • Olá Fabiano,

    Eu tenho um caso igual, e fiz o seguinte, a aplicação passa os códigos neste formato '1, 3, 6, 8' (por exemplo) então uso uma function para separar estes dados e retornar uma tabela, que posso usar num join.

     

    Código da Function:

    set ANSI_NULLS ON
    set
    QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[fnStringToInt] (@String VARCHAR(1000))
    RETURNS @Inteiros TABLE (IDs int)
    AS
    BEGIN
    DECLARE @Int INT
    IF PATINDEX ('%,%', @String) = 0
    INSERT INTO @Inteiros VALUES (@String)
    ELSE
    BEGIN
    WHILE PATINDEX ('%,%', @String) > 0
    BEGIN
    INSERT INTO @Inteiros VALUES (CONVERT (INT, SUBSTRING (@String, 1, PATINDEX ('%,%', @String) - 1)))
    SET @String = SUBSTRING (@String, PATINDEX ('%,%', @String) + 1, LEN(@String))
    END
    INSERT INTO @Inteiros VALUES (@String)
    END
    RETURN
    END

    Na consulta ficaria assim:

    Select Top 10 n.cod, n.titulo, c.conteudo, n.dtPub
    From tbl_news n
    Join tbl_conteudo c On n.cConteudo = c.cod
    Where n.dtPub <= getDate() And n.status = 1 And n.cCategoria in (SELECT IDs FROM dbo.fnStringToInt(@cat))
    Order By n.dtPub Desc, n.cod Desc

     

    Espero ter ajudado. Qualquer coisa retorna aqui.

    Abs.

    quarta-feira, 27 de setembro de 2006 19:36
  • E aí Fabiano,

    Na real, o retorno da Function é dinâmico, apenas retorna o resultado como se fosse uma tabela, mas na verdade ela não existe, é "virtual". Não tem problema algum de dois usuário estarem rodando.

    Blz?

    Qualquer coisa retorna aqui.

     

    Abs.

    quarta-feira, 27 de setembro de 2006 20:29

Todas as Respostas

  • Olá Fabiano,

    Eu tenho um caso igual, e fiz o seguinte, a aplicação passa os códigos neste formato '1, 3, 6, 8' (por exemplo) então uso uma function para separar estes dados e retornar uma tabela, que posso usar num join.

     

    Código da Function:

    set ANSI_NULLS ON
    set
    QUOTED_IDENTIFIER ON
    GO
    ALTER FUNCTION [dbo].[fnStringToInt] (@String VARCHAR(1000))
    RETURNS @Inteiros TABLE (IDs int)
    AS
    BEGIN
    DECLARE @Int INT
    IF PATINDEX ('%,%', @String) = 0
    INSERT INTO @Inteiros VALUES (@String)
    ELSE
    BEGIN
    WHILE PATINDEX ('%,%', @String) > 0
    BEGIN
    INSERT INTO @Inteiros VALUES (CONVERT (INT, SUBSTRING (@String, 1, PATINDEX ('%,%', @String) - 1)))
    SET @String = SUBSTRING (@String, PATINDEX ('%,%', @String) + 1, LEN(@String))
    END
    INSERT INTO @Inteiros VALUES (@String)
    END
    RETURN
    END

    Na consulta ficaria assim:

    Select Top 10 n.cod, n.titulo, c.conteudo, n.dtPub
    From tbl_news n
    Join tbl_conteudo c On n.cConteudo = c.cod
    Where n.dtPub <= getDate() And n.status = 1 And n.cCategoria in (SELECT IDs FROM dbo.fnStringToInt(@cat))
    Order By n.dtPub Desc, n.cod Desc

     

    Espero ter ajudado. Qualquer coisa retorna aqui.

    Abs.

    quarta-feira, 27 de setembro de 2006 19:36
  • Alexandre,

    Muito bom...

    Mas só uma pergunta, onde você mata a tabela? Depois que tenho o select? Ou toda seleção ele recria essa tabela? Agora e se dois usuários fizerem o mesmo procedimentos usando assim a query?

     

    Muito obrigado!

    Já resolve o problema, mas gostaria de ter essas informações.

    Desde já grato!

    quarta-feira, 27 de setembro de 2006 20:03
  • E aí Fabiano,

    Na real, o retorno da Function é dinâmico, apenas retorna o resultado como se fosse uma tabela, mas na verdade ela não existe, é "virtual". Não tem problema algum de dois usuário estarem rodando.

    Blz?

    Qualquer coisa retorna aqui.

     

    Abs.

    quarta-feira, 27 de setembro de 2006 20:29