--Permite rellenar con un caracter dado a la izquierda hasta completar
-- la longitud deseada
CREATE FUNCTION [dbo].[fnPADL](
@strOrigen VARCHAR(50), --String original
@intlen INT, --longitud a completar
@chrCaracter CHAR) --Caracter con el que se rellena
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @len INT = LEN(@strOrigen)
RETURN (
CASE
WHEN @len < @intlen THEN REPLICATE(@chrCaracter, @intlen - @len) + @strOrigen
ELSE @strOrigen
END)
END
--Permite rellenar con un caracter dado a la derecha hasta completar
-- la longitud deseada
CREATE FUNCTION [dbo].[fnPADR](
@strOrigen VARCHAR(50), --String original
@intlen INT, --longitud a completar
@chrCaracter CHAR) --Caracter con el que se rellena
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @len INT = LEN(@strOrigen)
RETURN (
CASE
WHEN @len < @intlen THEN @strOrigen + REPLICATE(@chrCaracter, @intlen - @len)
ELSE @strOrigen
END)
END
Ambas funciones se aseguran que si la longitud de la palabra es mayor o igual a la longitud a cubrir devuelva la misma palabra.Su forma de utilización sería
SELECT DBO.fnPADL ('HOLA',6,'X')
--devuelve: XXHOLA
SELECT DBO.fnPADR ('HOLA',6,'X')
-- devuelve: HOLAXX
SELECT DBO.fnPADL ('HOLA',2,'X')
-- devuelve: HOLA
Es muy muy importante a tener en cuenta que aunque estén disponibles las UDF (User-Defined Function) que devuelven escalares (como las que acabamos de definir) no es muy recomendable su uso, principalmente con grandes conjuntos de datos, En otro post intentaré ahondar mas en el por qué, quizás con algunas comparativas pero de momento el consejo sería: siempre que sea posible usar la lógica "in line" o dentro de la misma sentencia SQL, por ejemplo es más eficiente esto
SELECT REPLICATE('X',6 - LEN(miColumna)) + miColumna
FROM miTabla
en lugar de esto:
SELECT DBO.fnPADL (miColumna,6,'X')
FROM miTabla
Obviamente con una cantidad de datos significativa, Además para usar la primera sentencia tenemos que estar seguros que la longitud de miColumna no es mayor a 6.En todo caso recordar que si vamos a usar UDF escalares debemos realizar pruebas con buenos volúmenes de datos.