
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
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


0