Ir para conteúdo

POWERED BY:

Arquivado

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

Davis

Inserir valores nulos na tabela temporária quando a query retorna vazi

Recommended Posts

Opa!

 

Eu estou trabalhando com uma stored procedure pegando vários valores atendendo vários critérios diferentes. Um exemplo rápido do que estou fazendo seria:

 

--inserindo na tabela temporária (algumas tem union e mais uma cambada de coisa, mas a idéia principal é essa)INSERT INTO #tbTemp1 (id_customer, date_pay, amount_pay)(	SELECT id_customer, date_pay, amount_pay	FROM tbCustomers	WHERE amount_pay > 100)--inserindo na tabela de resultadosINSERT INTO #tbRep (id_customer, date_pay, amount_pay, label)(		SELECT COUNT(id_customer), (COUNT(id_customer) * amount_pay), amount_pay, 'New Monthly Donors'	FROM #tbTemp1	GROUP BY amount_pay)

E isso vai se repetindo por umas 17 vezes mudando apenas o WHERE. Como eu nem sempre tenho registros atendendo ao critério isso se torna um problema na hora de montar o gridview e exportar para o excel, já que eu tenho que ter 17 linhas de dados (padrão do cliente).

 

Alguém tem alguma idéia de como eu deveria fazer pra inserir valores nulos na tabela caso o SELECT não retorne nada?

 

Valeu!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma possível solução seria usar a função ROWCOUNT

 

segue um exemplo:

--setando banco de dados para testesuse Northwind;--zerando o rowcount (padrão é zero mesmo, que faz voltar todas as linhas)set rowcount 0 --tabela virtual para testesdeclare @teste table (CustomerID nchar(5), CompanyName nvarchar(40))--inserindo todos os registros da tabela  CustomerID (91 registros)insert into @teste (CustomerID, CompanyName)	SELECT CustomerID, CompanyName	FROM Customers--variavel para controle de registros inseridosdeclare @contador int--retorna o total de registro da tabela virtual (91)select @contador = count(*) from @teste--como eu quero 100 registros na tabela, faço 100 - váriavel @contador, no exemplo aqui vai retornar 9set @contador = 100 - @contador--setando o rowcount para a váriavel @contador, no caso aqui 9set rowcount @contador --inserindo as linhas nulas, neste select serão retornados o máximo de linhas definidos pela váriavel @contador, que foi setado para o rowcountinsert into @teste (CustomerID, CompanyName)	SELECT null, null	FROM Customers--voltadando o rowcount para o padrãoset rowcount 0--consultando a tabela virtual com o resultado final, os últimos 9 registros estarão nulosselect * from @teste
ai é só fazer as adaptações, e fazer os tratamentos, tipo se vier mais que o mínimo de registros, no caso do exemplo aqui seria 100, se voltasse mais que 100 registros teria que fazer o tratamento para o valor da variavel @contador não ficar zero ou negativo, dai nem precisaria de inserir os nulos e talz

 

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow eriva_br, valeu mesmo! Funcionou (até demais)... :D

 

Depois de fazer eu vi que os nulos tinham que ir pro meio da tabela (tapa buracos, sabe...). Aí eu fiz um IF checando os valores nulos:

 

--inserindo na tabela temporária (algumas tem union e mais uma cambada de coisa, mas a idéia principal é essa)INSERT INTO #tbTemp1 (id_customer, date_pay, amount_pay)(	SELECT id_customer, date_pay, amount_pay	FROM tbCustomers	WHERE amount_pay > 100)select @count = count(*) from #tbTemp1if @count > 0begin	--inserindo na tabela de resultados	INSERT INTO #tbRep (id_customer, date_pay, amount_pay, label)	(			SELECT COUNT(id_customer), (COUNT(id_customer) * amount_pay), amount_pay, 'New Monthly Donors'		FROM #tbTemp1		GROUP BY amount_pay	)endelsebegin	--inserindo na tabela de resultados	INSERT INTO #tbRep (id_customer, date_pay, amount_pay, label) VALUES (null, null, null, 'New Monthly Donors')end

 

Valeu pela luz!

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.