Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

berkowitz

IF ou CASE em Procs

Recommended Posts

Fala galera! beleza?

 

Tenho uma proc assim:

...
SELECT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY LinCod, TLiCod ASC) AS ID, LinCod, TLiCod
FROM VSLinGar (NOLOCK)
WHERE GarCod = @garCod AND Arecod = @areCod AND Empcod = @empCod
) AS linhas
WHERE id BETWEEN(((@paginaAtual - 1) * @registros) + 1) AND (@paginaAtual * @registros)

Não tenho muitos conhecimentos em SQL e preciso fazer um IF mas não sei como proceder. Preciso alterar o WHERE de acordo com o valor de um parâmetro.

Como faço isso?

 

Tipo assim:

If @linCod is not null
begin
-- Fica WHERE GarCod = @garCod AND Arecod = @areCod AND Empcod = @empCod
END
ELSE
-- Fica WHERE linCod = @linCod

Alguém pode me dar uma luz por favor?

 

Abraços!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa... faltou explicar o que pretendo! rs...

 

Basicamente é isto: Se o 'cara' informar o parâmetro @linCod então minha query retorna somente as informações q o 'cara' pediu. Se ele não informar (se ela for NULL) então a query retorna a busca completa.

 

É 'flórida' de explicar, mas é isso aí! rs...

 

ABRAX!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar uma olhada nos exemplos, mas fiz uma tentativa aqui e funcionou! Vou dar uma olhada na performance pra ver se vale a pena!

Ficou assim:

 

...

SELECT * FROM (

SELECT ROW_NUMBER() OVER(ORDER BY LinCod, TLiCod ASC) AS ID, LinCod, TLiCod

FROM VSLinGar (NOLOCK)

WHERE GarCod = @garCod AND Arecod = @areCod AND Empcod = @empCod and (linCod = @linCod or @linCod is null)

) AS linhas

WHERE id BETWEEN(((@paginaAtual - 1) * @registros) + 1) AND (@paginaAtual * @registros)

Aí se o 'cara' informar o parâmetro @linCod a query faz a busca pra mim. Se ele não informa ela traz completo.

 

Valew cara!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... no fim das contas minha proc ficou assim:

 

CREATE PROC sp_SLinGar_Pag (
@paginaAtual INT,
@registros INT,
@garCod INT,
@areCod INT,
@empCod INT,
@linCod VARCHAR(4)
) AS
BEGIN

SELECT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY LinCod, TLiCod ASC) AS ID, LinCod, TLiCod
FROM VSLinGar (NOLOCK)
WHERE GarCod = @garCod AND Arecod = @areCod AND Empcod = @empCod and (linCod = @linCod or @linCod is null)
) AS linhas
WHERE id BETWEEN(((@paginaAtual - 1) * @registros) + 1) AND (@paginaAtual * @registros)

END

Obrigado pela ajuda.

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

para facilitar eu costumo criar uma string e vou montando o script do comando que desejo. dessa forma posso colocar If's e tratamentos diversos, e no final o comando fica enxuto.

 

exemplo:

 

DECLARE @v_sql	   VARCHAR(8000);   -- Script SQL a ser executado

   SET @v_sql = '';
   SET @v_sql = @v_sql + '  SELECT pv.sigla_rede AS [Rede]' + CHAR(13);
   SET @v_sql = @v_sql + '	   , pv.sigla_master AS [Master]' + CHAR(13);
   SET @v_sql = @v_sql + '	   , pv.codigo_empresa AS [Nº]' + CHAR(13);
   SET @v_sql = @v_sql + '	   , pv.nome_empresa AS [Loja]' + CHAR(13);
   SET @v_sql = @v_sql + '	   , pv.sigla_indicador AS [KPI]' + CHAR(13);
   SET @v_sql = @v_sql + '	   , pv.data' + CHAR(13);
   SET @v_sql = @v_sql + '	   , [SAL], [VIA], [DRI], [DEL], [FES], [BAL], [SEL], [BFS], [QUI], [XXX], [TOT]' + CHAR(13);
   SET @v_sql = @v_sql + '	FROM (SELECT v.sigla_rede' + CHAR(13);
   SET @v_sql = @v_sql + '			   , v.sigla_master' + CHAR(13);
   SET @v_sql = @v_sql + '			   , v.codigo_empresa' + CHAR(13);
   SET @v_sql = @v_sql + '			   , v.nome_empresa' + CHAR(13);
   SET @v_sql = @v_sql + '			   , f.sigla_indicador' + CHAR(13);
   SET @v_sql = @v_sql + '			   , f.sigla_ponto_venda' + CHAR(13);
   SET @v_sql = @v_sql + '			   , RIGHT(CONVERT(VARCHAR, f.data, 103), 7) AS [data]' + CHAR(13);
   SET @v_sql = @v_sql + '			   , CAST(f.valor AS NUMERIC(13,2)) AS [valor]' + CHAR(13);
   SET @v_sql = @v_sql + '			FROM ECDADOS.online.FECHAMENTO f' + CHAR(13);
   SET @v_sql = @v_sql + '	   LEFT JOIN ECENTRAL.dbo.V_REDE_MASTER_EMPRESA v ON (v.sigla_rede = f.sigla_rede) AND (v.chave_empresa = f.chave_empresa)' + CHAR(13);
   SET @v_sql = @v_sql + '		   WHERE (f.sigla_rede = ''' + @i_rede + ''')' + CHAR(13);

   IF (@i_lojas <> '')
	  SET @v_sql = @v_sql + '			 AND (v.codigo_empresa IN (' + @i_lojas + '))' + CHAR(13);

   SET @v_sql = @v_sql + '			 AND (f.sigla_indicador = ''' + @i_kpi + ''')' + CHAR(13);
   SET @v_sql = @v_sql + '			 AND (f.sigla_origem = ''' + @i_origem + ''')' + CHAR(13);
   SET @v_sql = @v_sql + '			 AND (f.sigla_periodo = ''MES'')' + CHAR(13);
   SET @v_sql = @v_sql + '			 AND (YEAR(f.data) = ' + @i_ano + ')' + CHAR(13);
   SET @v_sql = @v_sql + '			 AND (MONTH(f.data) IN (' + @i_meses + '))) x' + CHAR(13);
   SET @v_sql = @v_sql + '   PIVOT (SUM(x.valor)' + CHAR(13);
   SET @v_sql = @v_sql + '		  FOR x.sigla_ponto_venda IN ([SAL], [VIA], [DRI], [DEL], [FES], [BAL], [SEL], [BFS], [QUI], [XXX], [TOT])) pv' + CHAR(13);
   SET @v_sql = @v_sql + 'ORDER BY pv.sigla_rede, pv.codigo_empresa, pv.data' + CHAR(13);
   EXECUTE (@v_sql);

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.