Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Valor Nulo de View para Stored Procedure


Viperino

Pergunta

Bom dia, pessoal.

Gostaria de saber se me podem ajudar com uma dúvida que tenho aqui.

Tenho um query em uma view que corre perfeitamente, cujo código é este:

Select HA_Id, HA_Seg_Id, HA_Data

from dbo.Hist_Analysis

where (HA_Data BETWEEN CONVERT(DATETIME,'2001-01-01 00:00:00', 102) AND CONVERT(DATETIME,'2009-01-01 00:00:00', 102) AND (HA_Seg_Id IS NULL)

que retorna todos os registos (3, neste caso) entre estas 2 datas e que não têm nada no campo de Seguro (HA_Seg_Id).

No entanto, passando para um SP, assim:

CREATE PROC A_01

(@Date_st smalldatetime, @Date_end smalldatetime, @Insurance bigint)

as

SELECT HA_Id as An, HA_Seg_Id as Insur, HA_Data as Date

from dbo.Hist_Cli

WHERE (HA_Seg_Id = @Insurance) AND (HA_Data>=@Date_st and HA_Data<=@Date_end)

não consigo passar o referido valor NULL quando invoco a SP com

exec A_01 @Date_st='01-01-2000', @Date_end='01-01-2009', @Insurance=Null

O comando aparece como "successfully" mas não retorna registos.

Alguém consegue perceber onde está o erro?

Obrigado

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Viperino,

Na verdade você está passando sim o valor NULL para a variável. Mas o problema não está na passagem de parâmetro. O comando aparece "successfully" e está ok mesmo. :.)

No primeiro select que postou, dê uma olhada onde está em negrito:

Select HA_Id, HA_Seg_Id, HA_Data

from dbo.Hist_Analysis

where (HA_Data BETWEEN CONVERT(DATETIME,'2001-01-01 00:00:00', 102) AND CONVERT(DATETIME,'2009-01-01 00:00:00', 102) AND (HA_Seg_Id IS NULL)

Quando você cria a procedure e passa NULL para a variável "@Insurance", você faz WHERE (HA_Seg_Id = @Insurance).

Está aí o problema. Ao invés de IS NULL você está fazendo =NULL.

O comando realmente executa sem erro, mas o retorno será diferente.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado, fulvio, pela resposta.

Então o problema está na SP ou no modo como a executo? É que não consigo executá-la sem ser assim. Se colocar

exec A_01 @Date_st='01-01-2000', @Date_end='01-01-2009', @Insurance IS Null

aparece a mensagem de erro " erro perto de IS" e não aceita.

Link para o comentário
Compartilhar em outros sites

  • 0

A chamada está correta:

exec A_01 @Date_st='01-01-2000', @Date_end='01-01-2009', @Insurance=Null

O problema está na hora de manipular a variável "@Insurance" dentro da Procedure. você postou:

CREATE PROC A_01
(@Date_st smalldatetime, @Date_end smalldatetime, @Insurance bigint)
as
SELECT HA_Id as An, HA_Seg_Id as Insur, HA_Data as Date
from dbo.Hist_Cli
WHERE (HA_Seg_Id = @Insurance) AND (HA_Data>=@Date_st and HA_Data<=@Date_end)
Mas caso a variável "@Insurance" seja NULL, a estrutura deverá estar assim:
CREATE PROC A_01
(@Date_st smalldatetime, @Date_end smalldatetime, @Insurance bigint)
as
IF @Insurance is null
Begin
  SELECT HA_Id as An, HA_Seg_Id as Insur, HA_Data as Date
  from dbo.Hist_Cli
  WHERE (HA_Seg_Id IS NULL) AND (HA_Data>=@Date_st and HA_Data<=@Date_end)
End 
Else
Begin
  SELECT HA_Id as An, HA_Seg_Id as Insur, HA_Data as Date
  from dbo.Hist_Cli
  WHERE (HA_Seg_Id = @Insurance) AND (HA_Data>=@Date_st and HA_Data<=@Date_end)
end

Faça os testes pra ver se executa.

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, era exactamente isso. Muito obrigado, fulvio. Estranho como necessitou de mais código do que na view, mas o que interessa é que me ajudou a pôr isto a funcionar. Muito obrigado.

Outra questão (esta, penso eu que mais fácil):

Nesta view:

SELECT     TOP (100) PERCENT dbo.Tipo_Analise.TA_Id AS [Tipo de Análise], dbo.Historico_Analises.HA_Id AS [Análise Efectuada], 
                      dbo.Historico_Analises.HA_Ind_Suplem AS Variante
FROM         dbo.T_Ana_Ind INNER JOIN
                      dbo.Tipo_Analise ON dbo.T_Ana_Ind.TAI_TA_Id = dbo.Tipo_Analise.TA_Id INNER JOIN
                      dbo.Historico_Analises ON dbo.Tipo_Analise.TA_Id = dbo.Historico_Analises.HA_TA_Id
GROUP BY dbo.Tipo_Analise.TA_Id, dbo.Historico_Analises.HA_Id, dbo.Historico_Analises.HA_Ind_Suplem
ORDER BY [Tipo de Análise]

recebo as análises de todos os tipos, com variantes. Sabe dizer-me como faço para juntar a estes, um campo com o total por tipo?

Editado por Viperino
Link para o comentário
Compartilhar em outros sites

  • 0

O script ficou grande por causa da sintaxe do NULL mesmo. Como você tem q colocar o IS antes, não dá pra fazer apenas 1 select para as duas opções.... rs.

Tem outra forma de fazer, mas acho viável apenas quando a estrutura fica MUITO grande, ou as execuções precisarem de ser dinâmicas: você cria uma variável varchar, insere o script nela e manda executar a variável.

Ficaria mais ou menos assim:

Declare @SQL varchar(100)
Set @SQL = 'select top 1 * from dbo.Hist_Cli'
exec (@SQL)
Desta forma, você cria seus scripts dinamicamente!! Se preferir... rs. Em relação a outra questão. Não sei se entendi direito, mas você quer um total por [Tipo de Análise]? Se for, testa aí e vê se funciona:
SELECT TOP (100) PERCENT dbo.Tipo_Analise.TA_Id AS [Tipo de Análise], count(dbo.Tipo_Analise.TA_Id) as [Total Tipo], 
dbo.Historico_Analises.HA_Id AS [Análise Efectuada], 
dbo.Historico_Analises.HA_Ind_Suplem AS Variante
FROM dbo.T_Ana_Ind INNER JOIN
dbo.Tipo_Analise ON dbo.T_Ana_Ind.TAI_TA_Id = dbo.Tipo_Analise.TA_Id INNER JOIN
dbo.Historico_Analises ON dbo.Tipo_Analise.TA_Id = dbo.Historico_Analises.HA_TA_Id
GROUP BY dbo.Tipo_Analise.TA_Id, dbo.Historico_Analises.HA_Id, dbo.Historico_Analises.HA_Ind_Suplem
ORDER BY [Tipo de Análise]

Uma dúvida: porque o TOP (100) PERCENT? Se você está pegando 100%, esta informação pode ser suprimida....

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...