CREATE FUNCTION dbo.UrlDecode(@url varchar(3072)) RETURNS varchar(3072) AS BEGIN DECLARE @count int, @c char(1), @cenc char(2), @i int, @urlReturn varchar(3072) SET @count = Len(@url) SET @i = 1 SET @urlReturn = '' WHILE (@i <= @count) BEGIN SET @c = substring(@url, @i, 1) IF @c LIKE '[!%]' ESCAPE '!' BEGIN SET @cenc = substring(@url, @i + 1, 2) SET @c = CHAR(CASE WHEN SUBSTRING(@cenc, 1, 1) LIKE '[0-9]' THEN CAST(SUBSTRING(@cenc, 1, 1) as int) ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 1, 1)))-55 as int) END * 16 + CASE WHEN SUBSTRING(@cenc, 2, 1) LIKE '[0-9]' THEN CAST(SUBSTRING(@cenc, 2, 1) as int) ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 2, 1)))-55 as int) END) SET @urlReturn = @urlReturn + @c SET @i = @i + 2 END ELSE BEGIN SET @urlReturn = @urlReturn + @c END SET @i = @i +1 END RETURN @urlReturn END
CREATE FUNCTION dbo.fnDeURL ( @URL VARCHAR(8000) ) RETURNS VARCHAR(8000) AS BEGIN DECLARE @Position INT, @Base CHAR(16), @High TINYINT, @Low TINYINT, @Pattern CHAR(21) SELECT @Base = '0123456789abcdef', @Pattern = '%[%][0-9a-f][0-9a-f]%', @URL = REPLACE(@URL, '+', ' '), @Position = PATINDEX(@Pattern, @URL) WHILE @Position > 0 SELECT @High = CHARINDEX(SUBSTRING(@URL, @Position + 1, 1), @Base COLLATE Latin1_General_CI_AS), @Low = CHARINDEX(SUBSTRING(@URL, @Position + 2, 1), @Base COLLATE Latin1_General_CI_AS), @URL = STUFF(@URL, @Position, 3, CHAR(16 * @High + @Low - 17)), @Position = PATINDEX(@Pattern, @URL) RETURN @URL END