Ir para conteúdo

POWERED BY:

Arquivado

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

zenfra

procedure

Recommended Posts

Bom dia,Gostaria de tirar uma dúvida sobre procedure.Preciso selecionar os dados baseados em uma lista de estados selecionados pelo cliente através da aplicação. Para isso criei uma procedure onde declarei uma variável chamada @LIST_ESTADO como varchar(1000) para passar os estados selecionados pelo cliente para filtrar os registros que eu quero que sejam retornados. Mas, acontece o seguinte, se eu passo um estado para a procedure como ‘SP’ por exemplo, ele me traz os registros que contenham SP no campo Estado, agora se eu passo 'SP,MG' ele não retorna nada. Queria saber como eu poderia passar uma lista de valores para uma procedure para um determinado campo, onde eu vou usar a clausula IN para selecionar os dados a partir dos valores existentes nessa lista.Abaixo esta a procedure que eu criei:create proc PC_Grafico_2@COD_CLI varchar(10), @DT_INICIO datetime,@DT_FINAL datetime,@LIST_UF varchar(1000)asselect distinct a.CD_Srl_key, convert(datetime,a.cd_reg_now,103) as 'Data_Cadastro', a.CD_empresa, c.ds_emp, case when e.ds_ddlProduto is null or e.ds_ddlProduto = '' then 'Em Branco' else e.ds_ddlProduto end as 'Produto', case when e.ds_ddlModelo is null or e.ds_ddlModelo = '' then 'Em Branco' else e.ds_ddlModelo end as 'Modelo', case when f.ds_TxtForum is null or f.ds_TxtForum = '' then 'Em Branco' else f.ds_TxtForum end as 'Forum', case when f.ds_TxtInstancia is null or f.ds_TxtInstancia='' then 'Em Branco' else f.ds_TxtInstancia end as 'Instancia', case when f.ds_Txtvara is null or f.ds_Txtvara = '' then 'Em branco' else f.ds_Txtvara end as 'Vara', case when f.ds_TxtCidade is null or f.ds_TxtCidade = '' then 'Em Branco' else f.ds_TxtCidade end as 'Cidade' , case when f.ds_TxtUF is null or f.ds_TxtUF = '' then 'Em Branco' else f.ds_TxtUF end as 'Estado', case when g.ds_Txtnome_parte_assist_0 is null or g.ds_Txtnome_parte_assist_0 = '' then 'Em Branco' else g.ds_Txtnome_parte_assist_0 end as 'Assistencia' from Portal.dbo.tb_portal_key a inner join portal.dbo.tb_portal_cliente c on c.cd_id = a.CD_Srl_key inner join portal.dbo.tb_portal_consumidor d on d.cd_id = a.CD_Srl_key inner join portal.dbo.tb_portal_assistencia e on e.cd_id = a.CD_Srl_key inner join portal.dbo.tb_portal_forum f on f.cd_id = a.CD_Srl_key inner join portal.dbo.tb_portal_parte_assist g on g.cd_id = a.CD_Srl_key where a.CD_empresa = @COD_CLI and convert(datetime,a.cd_reg_now,103) between @DT_INICIO and @DT_FINAL and f.ds_TxtUF in (@LIST_UF) obrigado pela atenção

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara usando IN não consegui fazer e acho que perde mta performance.

 

Aqui onde trabalho desenvolvi uma sp que simula receber um array (na verdade um string delimitada) e extrai os pedaços da stirng e grava no bd.

 

Veja o exemplo:

 

-- O parâmtro @UF deverá ser passando: 'SP@|MG' -- entre ' (plics) e delimitado por @|-- se preferir pode usar outro delimitador de sua preferência DECLARE	@SIGAL_UF			CHAR(2),			@DELIMITADOR 		VARCHAR(2),	  			@UF					varchar(4000)--Reecberá o parâmtros de entrada separados por @|		  		-- Define delimitador	SELECT 	@DELIMITADOR = '@|',			@UF = 'MG@|SP' -- Mude aqui para mudar resultado da query				 	CREATE TABLE #TMP (		NOME VARCHAR(10) NULL,		UF	 CHAR(2) NULL	)		CREATE TABLE #TMP_SAIDA (		NOME VARCHAR(10) NULL,		UF	 CHAR(2) NULL	)		INSERT INTO #TMP (NOME,UF) VALUES ('NOME1','DF')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME2','DF')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME3','SP')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME4','SP')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME5','MG')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME6','MG')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME7','MG')	INSERT INTO #TMP (NOME,UF) VALUES ('NOME8','SP')     BEGIN TRAN	 	--Concatena o @DELIMITADOR no final de @sCoCpfCnpj	IF LEN(@UF) > 0 SET @UF= @UF + @DELIMITADOR   	--Inicia loop para extrair sCoCpfCnpj para efetuar a Atualziação	WHILE LEN(RTrim(LTrim(@UF))) > 0	BEGIN			--Localiza e extrai a UF			SELECT @SIGAL_UF	= SUBSTRING(@UF, 1, CHARINDEX(@DELIMITADOR, @UF) - 1)						INSERT 	INTO #TMP_SAIDA (NOME,UF)			SELECT 	NOME,UF 			FROM 	#TMP			WHERE 	#TMP.UF =  @SIGAL_UF	 	 		--Retira Localiza e extrai a UF			SELECT @UF= SUBSTRING(@UF, CHARINDEX(@DELIMITADOR, @UF) + 2, LEN(@UF))  	END 	SELECT * FROM #TMP_SAIDA		DROP TABLE #TMP_SAIDA	DROP TABLE #TMP	IF @@error = 0	BEGIN			COMMIT TRAN	END	ELSE	BEGIN			ROLLBACK TRAN	END

Você pode cria uma sp e modificar os delimitadores.

 

QQ duvida estamos ai.

 

Deu uma luz?

 

jothaz

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.