Viperino Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 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_Datafrom dbo.Hist_Analysiswhere (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)asSELECT HA_Id as An, HA_Seg_Id as Insur, HA_Data as Datefrom dbo.Hist_CliWHERE (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 comexec A_01 @Date_st='01-01-2000', @Date_end='01-01-2009', @Insurance=NullO comando aparece como "successfully" mas não retorna registos.Alguém consegue perceber onde está o erro?Obrigado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 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_Datafrom dbo.Hist_Analysiswhere (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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Viperino Postado Abril 7, 2010 Autor Denunciar Share Postado Abril 7, 2010 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 colocarexec A_01 @Date_st='01-01-2000', @Date_end='01-01-2009', @Insurance IS Nullaparece a mensagem de erro " erro perto de IS" e não aceita. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Viperino Postado Abril 7, 2010 Autor Denunciar Share Postado Abril 7, 2010 (editado) 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 Abril 7, 2010 por Viperino Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Abril 7, 2010 Denunciar Share Postado Abril 7, 2010 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.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Abril 9, 2010 Denunciar Share Postado Abril 9, 2010 Tópico dividido. Continuação:http://scriptbrasil.com.br/forum/index.php?showtopic=148768 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Viperino
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
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.