Ir para conteúdo

POWERED BY:

Arquivado

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

Gvip

Criar SP com select e preencher uma coluna com outros selects

Recommended Posts

Galera não sei se tem como mas preciso fazer uma procedure que irá rodar um select e trará uma coluna nula, depois faria um while com o resultado desse select preenchendo a coluna nula com o resultado de outro select, teria como fazer?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

jus2ka,

 

Meu sistema faz faturamento em uma empresa de VOIP esse select seria para conferir faturas recebidas, portanto como nosso BD nem sempre está totalmente atualizado em comparação com o outro BD (que faz a bilhetagem das ligações) posso ter campos nulos no resultado.

 

segue o select:

 

SELECT convert(char(8),dateadd(hh,(s.bill_gmt+4),a.CDR_DATE),112) as start_time,s.name_qb as supplier,a.DP_PRFX_DESCRIPTION as DP_PRFX_DESCRIPTION,

sr.REGION as supplierregion, sum(a.DST_BILL_TIME) as costtime, DP_RATE as costrate_M

FROM OPENQUERY([***.***.***.***],

'select CDR_DATE,DP_PRFX_DESCRIPTION,DP_PRFX,DST_BILL_TIME,DP_RATE,dst_account_id from CDR_200803') a

left join supplier s on (a.dst_account_id = s.account_id)

left join supplierregion sr on (a.DP_PRFX = sr.PREFIX collate SQL_Latin1_General_CP1_CI_AS and s.name_qb = sr.carrier collate SQL_Latin1_General_CP1_CI_AS)

where a.dst_bill_time > 0 and

dateadd(hh,(s.bill_gmt+4),a.CDR_DATE) >= '2008-03-24 00:00:00' and dateadd(hh,(s.bill_gmt+4),a.CDR_DATE) <= '2008-03-30 23:59:59'

group by s.name_qb,sr.REGION,convert(char(8),dateadd(hh,(s.bill_gmt+4),a.CDR_DATE),112),a

.DP_PRFX_DESCRIPTION,a.DP_RATE

order by convert(char(8),dateadd(hh,(s.bill_gmt+4),a.CDR_DATE),112),s.name_qb,sr.REGION

 

Neste select trago o trafego que foi enviado para as empresas, e preciso tarifa-los, porém para pegar a tarifa correta preciso colocar condições de data que fazem com que não venham os campos nulos no resultado caso eu coloque um join, e eu preciso desses campos, então pensei na possibilidade de com o resultado desse select selecionar as tarifas colocando tudo em uma SP, acredito que seja possivel, porém nao sei como fazer, me disseram que usando CURSOR talvez consiga mas não sei como fazer, nunca usei CURSOR.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cursor pode ser que resolva seu problema, soh toma cuidado com processamento.

você jah tentou usar tabela temporaria? pode ser que de certo tb ^^

 

Se der certou ou nao poste o resultado :)

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom aparentemente irá funcionar, estou usando cursor e tabela temporaria, com o cursor irei preencher uma tabela temporaria e retornar o resultado para um programa que irá tratar os dados e inserir em outra tabela.

 

Só estou com um problema, tenho q colocar o select em uma string para ser concatenado com um parametro que será passado para a SP, pq a tabela de onde será feita a consulta é mensal e tem que ser alterada sempre que o mes muda e está dando erro no comando:

 

DECLARE S_BILLING CURSOR

 

FOR EXEC(@CONSULTA)

 

sabem se é possivel isso??

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

em particular nunca tentei fazer deste mopdo. o que eu jah fiz foi jogar dois cursores, um dentro do outro com IF.

^^

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu costumo fazer isso com o WHILE mesmo.

 

1º crio a tabela de RESULTADO com os campos que quero e dou o primeiro INSERT para abastecê-la

 

2º Processo a tabela de resultado item a item para preencher os valores que faltam.

 

3º Crio quando necessário, novos campos para preencher com valores

 

4º preencho o valor da tabela com um novo SELECT individual.

 

PS. às vezes é só criar o campo e mandar processar para todos os registros. depende do que está sendo processado.

 

um exemplo meu aqui

 

USE [BANCO]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ================================================================================
====================
-- == Apaga a Stored Procedure caso já exista														==
-- ================================================================================
====================
IF OBJECT_ID('[precos].[SP_LISTA_PRECOS]', 'P') IS NOT NULL 
   DROP PROCEDURE [precos].[SP_LISTA_PRECOS];
GO
-- ================================================================================
====================
-- == Autor	 : Fabiano Novaes Ferreira															==
-- == Criação   : 21/12/2007																		 ==
-- == Alteração : 22/12/2007																		 ==
-- == Descrição : Monta a lista de preços total ou individual										==
-- ================================================================================
====================
CREATE PROCEDURE [precos].[SP_LISTA_PRECOS]
				 @i_vigencia DATETIME	= ''
			   , @i_id	   VARCHAR(15) = ''
AS
-- ----------------------------------------------------------------------------------------------------
BEGIN TRY
   -- --------------------------------------------------------------------------------------------------
   -- -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.   --
   -- --------------------------------------------------------------------------------------------------
   SET NOCOUNT ON;

   -- --------------------------------------------------------------------------------------------------
   -- -- Declaração ads variáveis utilizadas pela Stored Procedure									--
   -- --------------------------------------------------------------------------------------------------
   DECLARE @v_seq INT
		 , @v_pdv VARCHAR(3)
		 , @v_sql VARCHAR(1000);

   -- -------------------------------------------------------------------------------------------------
   -- -- Ajusta os valores das variáveis de entrada												  --
   -- -------------------------------------------------------------------------------------------------
   IF (@i_vigencia = '')
	  SELECT @i_vigencia = MAX(data_vigencia)
		FROM precos.VIGENCIA
	   WHERE data_validacao IS NOT NULL;

   -- --------------------------------------------------------------------------------------------------
   -- -- Sai da procedure se não receber os valores necessários									   --
   -- --------------------------------------------------------------------------------------------------
   IF (@i_vigencia IS NULL)
	   RETURN(-1);

   -- -------------------------------------------------------------------------------------------------
   -- -- Cria a tabela temporária para processamento da lista de preços							  --
   -- -------------------------------------------------------------------------------------------------
   IF OBJECT_ID('tempdb..#RESULT', 'U') IS NOT NULL DROP TABLE #RESULT;

   CREATE TABLE #RESULT
			  ( id					 VARCHAR(15)
			  , data_vigencia		  DATETIME
			  , sigla_rede			 VARCHAR(3)
			  , sigla_tipo_empresa	 VARCHAR(3)
			  , descricao_tipo_empresa VARCHAR(50)
			  , sigla_tipo_produto	 VARCHAR(3)
			  , descricao_tipo_produto VARCHAR(50)
			  , sigla_grupo			VARCHAR(3)
			  , descricao_grupo		VARCHAR(50)
			  , sigla_subgrupo		 VARCHAR(3)
			  , descricao_subgrupo	 VARCHAR(50)
			  , codigo				 INT
			  , sigla_propriedade	  VARCHAR(3)
			  , descricao			  VARCHAR(150));

   -- -------------------------------------------------------------------------------------------------
   -- -- Insere todos os produtos que tem preço na tabela temporária --
   -- -------------------------------------------------------------------------------------------------
   INSERT #RESULT (id, data_vigencia, sigla_rede, sigla_tipo_empresa, descricao_tipo_empresa, sigla_tipo_produto, descricao_tipo_produto, sigla_grupo, descricao_grupo, sigla_subgrupo, descricao_subgrupo, codigo, sigla_propriedade, descricao)
		  SELECT DISTINCT 
				 SUBSTRING(p.sigla_tipo_produto	  + '###', 1, 3)
			   + SUBSTRING(p.sigla_grupo			 + '###', 1, 3)
			   + SUBSTRING(p.sigla_subgrupo		  + '###', 1, 3)
			   + SUBSTRING(CAST(p.codigo AS VARCHAR) + '###', 1, 3)
			   + SUBSTRING(p.sigla_propriedade	   + '###', 1, 3)
			   , p.data_vigencia
			   , p.sigla_rede
			   , p.sigla_tipo_empresa
			   , v.descricao_tipo_empresa
			   , p.sigla_tipo_produto
			   , v.descricao_tipo_produto
			   , p.sigla_grupo
			   , v.descricao_grupo
			   , p.sigla_subgrupo
			   , v.descricao_subgrupo
			   , p.codigo
			   , p.sigla_propriedade
			   , v.descricao
			FROM precos.PRECO p
	   LEFT JOIN produtos.V_PRODUTOS v  ON (v.sigla_rede		 = p.sigla_rede)
									   AND (v.sigla_tipo_empresa = p.sigla_tipo_empresa)
									   AND (v.sigla_tipo_produto = p.sigla_tipo_produto)
									   AND (v.sigla_grupo		= p.sigla_grupo)
									   AND (v.sigla_subgrupo	 = p.sigla_subgrupo)
									   AND (v.codigo			 = p.codigo)
									   AND (v.sigla_propriedade  = p.sigla_propriedade)
		   WHERE (p.data_vigencia = @i_vigencia)
			 AND ((@i_id = '') OR (SUBSTRING(p.sigla_tipo_produto	  + '###', 1, 3)
								 + SUBSTRING(p.sigla_grupo			 + '###', 1, 3)
								 + SUBSTRING(p.sigla_subgrupo		  + '###', 1, 3)
								 + SUBSTRING(CAST(p.codigo AS VARCHAR) + '###', 1, 3)
								 + SUBSTRING(p.sigla_propriedade	   + '###', 1, 3) = @i_id));

   -- --------------------------------------------------------------------------------------------------
   -- -- Processa todos os pontos de venda para preenchimento dos preços --
   -- --------------------------------------------------------------------------------------------------
   SELECT @v_seq = MIN(pv.sequencia)
	FROM dbo.PONTO_VENDA pv
   WHERE ((pv.publico = 1) OR (pv.sigla = 'PDR'));

   WHILE (@v_seq IS NOT NULL)
	  BEGIN
		 -- --------------------------------------------------------------------------------------------
		 -- -- Guarda a sigla do ponto de venda em processamento --
		 -- --------------------------------------------------------------------------------------------
		 SELECT @v_pdv = pv.sigla
		   FROM dbo.PONTO_VENDA pv
		  WHERE ((pv.publico = 1) OR (pv.sigla = 'PDR'))
			AND (pv.sequencia = @v_seq);
		 
		 -- --------------------------------------------------------------------------------------------
		 -- -- Cria o campo para o preço no ponto de venda processado --
		 -- --------------------------------------------------------------------------------------------
		 SET @v_sql = 'ALTER TABLE #RESULT ADD [' + @v_pdv + '] VARCHAR(15)';
		 EXECUTE (@v_sql);

		 -- --------------------------------------------------------------------------------------------
		 -- -- Atualiza o preço no ponto de venda processado para todos os produtos --
		 -- --------------------------------------------------------------------------------------------
		 SET @v_sql = '';
		 SET @v_sql = @v_sql + '   UPDATE #RESULT' + CHAR(13);
		 SET @v_sql = @v_sql + '	  SET [' + @v_pdv + '] = CAST(p.valor AS VARCHAR)' + CHAR(13);
		 SET @v_sql = @v_sql + '	 FROM #RESULT r' + CHAR(13);
		 SET @v_sql = @v_sql + 'LEFT JOIN precos.PRECO p  ON (p.data_vigencia	  = r.data_vigencia)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_rede		 = r.sigla_rede)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_tipo_empresa = r.sigla_tipo_empresa)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_tipo_produto = r.sigla_tipo_produto)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_grupo		= r.sigla_grupo)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_subgrupo	 = r.sigla_subgrupo)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.codigo			 = r.codigo)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_propriedade  = r.sigla_propriedade)' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.sigla_ponto_venda  = ''' + @v_pdv + ''')' + CHAR(13);
		 SET @v_sql = @v_sql + '						 AND (p.data_saida IS NULL)' + CHAR(13);
		 EXECUTE (@v_sql);

		 -- --------------------------------------------------------------------------------------------
		 -- -- Busca o proximo ponto de venda a ser processado --
		 -- --------------------------------------------------------------------------------------------
		 SELECT @v_seq = MIN(pv.sequencia)
		   FROM dbo.PONTO_VENDA pv
		  WHERE ((pv.publico = 1) OR (pv.sigla = 'PDR'))
			AND (pv.sequencia > @v_seq);
	  END;

   -- -------------------------------------------------------------------------------------------------
   -- -- Cria mais um campo para indicar se o produto tem promoções --
   -- -------------------------------------------------------------------------------------------------
   ALTER TABLE #RESULT ADD [promocao] BIT;

	  UPDATE #RESULT
		 SET [promocao] = CASE WHEN (p.valor IS NULL) THEN 0 ELSE 1 END
		FROM #RESULT r
   LEFT JOIN precos.PRECO_PROMOCAO p  ON (p.sigla_rede		 = r.sigla_rede)
									 AND (p.sigla_tipo_empresa = r.sigla_tipo_empresa)
									 AND (p.sigla_tipo_produto = r.sigla_tipo_produto)
									 AND (p.sigla_grupo		= r.sigla_grupo)
									 AND (p.sigla_subgrupo	 = r.sigla_subgrupo)
									 AND (p.codigo			 = r.codigo)
									 AND (p.sigla_propriedade  = r.sigla_propriedade)
									 AND (p.data_saida IS NULL);

   -- -------------------------------------------------------------------------------------------------
   -- -- Devolve o conteúdo da tabela temporária como resultado do processamento					 --
   -- -------------------------------------------------------------------------------------------------
	 SELECT * 
	   FROM #RESULT;

   -- -------------------------------------------------------------------------------------------------
   -- -- Apaga as tabelas temporárias																--
   -- -------------------------------------------------------------------------------------------------
   IF OBJECT_ID('tempdb..#RESULT', 'U') IS NOT NULL DROP TABLE #RESULT;

  END TRY
-- ----------------------------------------------------------------------------------------------------
BEGIN CATCH
	  -- ----------------------------------------------------------------------------------------------
	  -- -- Trata erros durante o processamento													  --
	  -- ----------------------------------------------------------------------------------------------
	  SELECT ERROR_NUMBER()	AS ErrorNumber,
			 ERROR_SEVERITY()  AS ErrorSeverity,
			 ERROR_STATE()	 AS ErrorState,
			 ERROR_PROCEDURE() AS ErrorProcedure,
			 ERROR_LINE()	  AS ErrorLine,
			 ERROR_MESSAGE()   AS ErrorMessage;
	  -- ----------------------------------------------------------------------------------------------
  END CATCH;
-- ----------------------------------------------------------------------------------------------------
GO

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.