Usuário com melhor resposta
Query - Where dinâmico !

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!
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
ENDNa 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 DescEspero ter ajudado. Qualquer coisa retorna aqui.
Abs.
-
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.
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
ENDNa 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 DescEspero ter ajudado. Qualquer coisa retorna aqui.
Abs.
-
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!
-
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.