SQL - Paso de parametros a una función

 
Vista:
Imágen de perfil de Edgard

Paso de parametros a una función

Publicado por Edgard (4 intervenciones) el 30/08/2023 17:41:02
Hola,

He programado una función en Transact-SQL que valida Rol Unico Tributario (RUT en chile):

CREATE FUNCTION dbo.fn_valida_formatea_rut (@rut_antes VARCHAR(20))

El problema está en cuando se le pasa como parámetro un ''

Luego de declarar las variables locales, la primera validación que hago es que el parámetro que se paso no sea '' pero cuando se llama la función me indica un error de que se le paso un parametro malo a la funcion left o substring, es decir se salta mi validación.

Sin embargo al ejecutar el código sin ser funcion declarando la variable @rut_antes, no tiene problema... Al parecer el problema está en el paso de parámetro.

-------------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[fn_valida_formatea_rut] (@rut_antes VARCHAR(20))
RETURNS VARCHAR(10)
AS BEGIN

-- RUT
DECLARE @Dv CHAR(1)
,@nums VARCHAR(20)
,@Rut VARCHAR(10)
,@lnum INT
,@i INT
,@ev NUMERIC(18,0)
,@sum NUMERIC(18,0)
,@x NUMERIC(18,0)
,@r VARCHAR(2)
,@a VARCHAR(20)

IF LEN(@rut_antes) < 8
SET @Rut = 'INVALIDO'
ELSE
BEGIN
-- Quita blancos
SET @rut_antes = REPLACE(@Rut_antes,' ','')

-- Quita puntos
SET @Rut_antes = REPLACE(LTRIM(RTRIM(@Rut_antes)),'.','')

-- Quita guion
SET @Rut_antes = REPLACE(LTRIM(RTRIM(@Rut_antes)),'-','')

-- Digito verificador
SET @Dv = RIGHT(@Rut_antes,1)

-- Seta parte numerica
SET @nums = LEFT(@Rut_antes,LEN(@Rut_antes)-1)

SET @sum = 0
SET @x = 2

IF @Dv NOT IN('0','1','2','3','4','5','6','7','8','9','K','k')
SET @Rut = 'INVALIDO'
ELSE
BEGIN

IF ISNUMERIC(@nums) = 0
SET @Rut = 'INVALIDO'
ELSE
BEGIN
IF CONVERT(NUMERIC(18,0),@nums) = 0
SET @Rut = 'INVALIDO'
ELSE
BEGIN
SET @lnum = LEN(@nums)
SET @i = 1
SET @a = @nums

WHILE @i <= @lnum
BEGIN
SET @ev = CONVERT(INT,RIGHT(@nums,1))
SET @sum = @sum+(@ev*@x)
SET @i = @i+1
IF @x = 7
SET @x = 2
ELSE
SET @x = @x+1
SET @nums = LEFT(@nums,LEN(@nums)-1)
END

SET @r = CONVERT(VARCHAR,@sum%11)
SET @r = 11-CONVERT(INT,@r)

IF @r = 10
SET @r = 'K'

IF @r = '11'
SET @r = '0'

IF @r != @Dv
SET @Rut = 'INVALIDO'
ELSE
SET @Rut = UPPER(CONVERT(NUMERIC(18,0),@a))+UPPER(@Dv)
END

END

END

END

RETURN @Rut

END
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Paso de parametros a una función

Publicado por Isaias (1921 intervenciones) el 30/08/2023 18:13:29
Hola, puedes mostrar como ejecutas tu función...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Paso de parametros a una función

Publicado por Edgard Antonio (4 intervenciones) el 30/08/2023 18:35:10
Hola,

dbo.fn_valida_formatea_rut(rut)

Donde (rut) es el campo que contiene el rut a validar, y cuando este es '' la funcnión se cae

De momento lo solucione con un

dbo.fn_valida_formatea_rut(case when rut = '' then '0' else rut end)

Pero no es la idea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Paso de parametros a una función

Publicado por Isaias (1921 intervenciones) el 30/08/2023 18:57:56
ok, ¿que valor lleva rut?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Paso de parametros a una función

Publicado por Edgard Antonio (4 intervenciones) el 30/08/2023 20:20:25
un rut chilen se compone de 2 partes, una numerica y un digito verificador que puede ser 0 a 9 o K, por ello si en el campo rut se ingresa un valor cuya parte numerica no pase la validación del digito verificador esta devuelve INVALIDO, pero lo que se pretende es que si el campo rut es '' (que es diferente a que sea NULL) debe devolver INVALIDO.

Para ello la primera validación es con el largo pero al pasar el parametro vacio ni siquiera avanza a la primera linea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Paso de parametros a una función

Publicado por Isaias (1921 intervenciones) el 02/09/2023 23:38:40
Sigo con la duda, lo ejecutas de esta forma: SELECT dbo.fn_valida_formatea_rut(rut)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Paso de parametros a una función

Publicado por Edgard Plaza (4 intervenciones) el 03/09/2023 22:50:38
Asi es, lo utilizo para poblar una tabla en la cual uno de los campos es rut, y existen algunos que vienen con '' que es distinto a NULL y la idea es que en esos casos no haga la validación y devuelva INVALIDO de inmediato.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Paso de parametros a una función

Publicado por Isaias (1921 intervenciones) el 07/09/2023 19:41:44
Con este IF, deberia darte el invalido, si solo trae blanco

IF @Dv NOT IN('0','1','2','3','4','5','6','7','8','9','K','k')
SET @Rut = 'INVALIDO'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar