Ir para conteúdo

POWERED BY:

Arquivado

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

toncris

Convertendo String DESCONHECIDA em smalldatetime

Recommended Posts

Pessoal,Estou com o seguinte problema:Tenho uma substring de tamanho 8 que que leio de um arquivo através de um linked server e preciso convertá-la em data para armazena no banco, porém não tenho como garantir que a substring esteja num formato yyyymmdd válido para uma data, por exemplo, posso ter uma string que seja "00000000" e ao usar o CONVERT(SMALLDATETIME,<substring>, 126) ´levantará o erro"The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value."Preciso cria uma function que trate isso e retorne NULL quando não for possível converter a substring. Com posso pegar este erro ?Obrigado desde já pela atenção

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma idéia seria tu criar uma function que verificasse se a data é valida, para isso podes usar a váriavel de sistema @@error, verificando se ela retornar difente de 0 (zero) é pq. ocorreu algum erro

 

exemplo:

declare @teste SMALLDATETIMEdeclare @_error int--OKset @teste = CONVERT(SMALLDATETIME,'20060418', 126)set @_error = @@errorif (@_error <> 0)	select @_error--com erroset @teste = CONVERT(SMALLDATETIME,'00000000', 126)set @_error = @@errorif (@_error <> 0)	select @_error--OKset @teste = CONVERT(SMALLDATETIME,'', 126)set @_error = @@errorif (@_error <> 0)	select @_error--com erroset @teste = CONVERT(SMALLDATETIME,'20060431', 126)set @_error = @@errorif (@_error <> 0)	select @_error

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Bom pensei pelo mesmo caminho mas só vi problema mesmo é que mesmo tarando o erro (@@ERROR) qdo ele ocorre a execução da função é cancelada.

 

Criei uma função assim:

CREATE FUNCTION VALIDA_DATA(@DT_EXTERNA VARCHAR(15))
RETURNS  VARCHAR(10) AS BEGIN DECLARE @DT_RETORNO VARCHAR(10)

SELECT @DT_RETORNO = CONVERT(DATETIME,@DT_EXTERNA)

IF @@ERROR = 242 ---The conversion of a char data type............
	SET @DT_RETORNO = ''

RETURN @DT_RETORNO
END

 

Mas se executo a função aparece o erro e para a execução.

 

você eriva conhecedor de todos os atalhos para os caminhos dificeis do SQL , conhece algo modo de ignorar o erro e continuar. Tipo o Resume Next do ASP ou try catch do Java?

 

Pq se não tiver como ignorar o erro e continuar acho que vai ficar dificil fazer direto no sql.

 

t+

 

uma idéia seria tu criar uma function que verificasse se a data é valida, para isso podes usar a váriavel de sistema @@error, verificando se ela retornar difente de 0 (zero) é pq. ocorreu algum erro

 

exemplo:

declare @teste SMALLDATETIMEdeclare @_error int--OKset @teste = CONVERT(SMALLDATETIME,'20060418', 126)set @_error = @@errorif (@_error <> 0)	select @_error--com erroset @teste = CONVERT(SMALLDATETIME,'00000000', 126)set @_error = @@errorif (@_error <> 0)	select @_error--OKset @teste = CONVERT(SMALLDATETIME,'', 126)set @_error = @@errorif (@_error <> 0)	select @_error--com erroset @teste = CONVERT(SMALLDATETIME,'20060431', 126)set @_error = @@errorif (@_error <> 0)	select @_error

Compartilhar este post


Link para o post
Compartilhar em outros sites

tarde senhores,

 

jothaz, podes cre, qdo. da erro a função não continua... q lixo..rsss

 

vamos recorrer a nossa querida RTA

 

podemos usar uma proc, pois proc vai até o fim

 

CREATE PROC SP_VALIDA_DATA	@DT_EXTERNA VARCHAR(30) OUTPUTAS BEGIN 	DECLARE @_Error INT		SELECT @DT_EXTERNA = CONVERT(DATETIME,@DT_EXTERNA)	SELECT @_Error = @@ERROR	IF (@_Error <> 0 )	BEGIN		SET @DT_EXTERNA = 'ERRO'		GOTO Error_Handling	END		Error_Handling:		RETURN @_ErrorEND
e para chamar:

DECLARE @TESTE VARCHAR(30)DECLARE @RET_ERRO INT--EXEMPLO OKSET @TESTE = '20070418'EXEC @RET_ERRO = SP_VALIDA_DATA @TESTE OUTPUTSELECT @TESTE, @RET_ERRO--EXEMPLO COM ERROSET @TESTE = '20070431'EXEC @RET_ERRO = SP_VALIDA_DATA @TESTE OUTPUTSELECT @TESTE, @RET_ERRO

OBS.: essa seria uma possível solução no SQL Server 2000, no SQL Server 2005 temos tratamentos de erro com TRY CAT, então teriamos uma solução mais elegante, infelizmente ainda não brinquei com o 2005

 

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gde eriva_br ,

 

 

Nada como perguntar para quem sabe! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Pois é, depois que postei pensei na sp mas nem testei.

 

Interessante vamos ver se mais alguém se manifesta!! rsssssssss

 

Agora acho que a melhor forma seria viar uma aplicação. Que fosse um executável (vb,delphi) rodando como serviço no servido e efetuando a consitência de data.

 

Mas todas essas sugestões depender do que nosso amigo toncris quer fazer.

 

t+

 

 

 

tarde senhores,

 

jothaz, podes cre, qdo. da erro a função não continua... q lixo..rsss

 

vamos recorrer a nossa querida RTA

 

podemos usar uma proc, pois proc vai até o fim

 

CREATE PROC SP_VALIDA_DATA	@DT_EXTERNA VARCHAR(30) OUTPUTAS BEGIN 	DECLARE @_Error INT		SELECT @DT_EXTERNA = CONVERT(DATETIME,@DT_EXTERNA)	SELECT @_Error = @@ERROR	IF (@_Error <> 0 )	BEGIN		SET @DT_EXTERNA = 'ERRO'		GOTO Error_Handling	END		Error_Handling:		RETURN @_ErrorEND
e para chamar:

DECLARE @TESTE VARCHAR(30)DECLARE @RET_ERRO INT--EXEMPLO OKSET @TESTE = '20070418'EXEC @RET_ERRO = SP_VALIDA_DATA @TESTE OUTPUTSELECT @TESTE, @RET_ERRO--EXEMPLO COM ERROSET @TESTE = '20070431'EXEC @RET_ERRO = SP_VALIDA_DATA @TESTE OUTPUTSELECT @TESTE, @RET_ERRO

OBS.: essa seria uma possível solução no SQL Server 2000, no SQL Server 2005 temos tratamentos de erro com TRY CAT, então teriamos uma solução mais elegante, infelizmente ainda não brinquei com o 2005

 

 

abs

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.