Question TSQL - Comment encoder les URL


Vous recherchez un script SQL testé sans bug que je pourrais utiliser dans un UDF pour encoder une URL via SQL. Fonction prendrait une URL et transmettrait une URL encodée en URL. J'en ai vu quelques-uns, mais tout ce que j'ai rencontré semble avoir des défauts.


10
2018-05-25 13:46


origine


Réponses:


Qu'en est-il de celui-ci par Peter DeBetta:

CREATE FUNCTION dbo.UrlEncode(@url NVARCHAR(1024))
RETURNS NVARCHAR(3072)
AS
BEGIN
    DECLARE @count INT, @c NCHAR(1), @i INT, @urlReturn NVARCHAR(3072)
    SET @count = LEN(@url)
    SET @i = 1
    SET @urlReturn = ''    
    WHILE (@i <= @count)
     BEGIN
        SET @c = SUBSTRING(@url, @i, 1)
        IF @c LIKE N'[A-Za-z0-9()''*\-._!~]' COLLATE Latin1_General_BIN ESCAPE N'\' COLLATE Latin1_General_BIN
         BEGIN
            SET @urlReturn = @urlReturn + @c
         END
        ELSE
         BEGIN
            SET @urlReturn = 
                   @urlReturn + '%'
                   + SUBSTRING(sys.fn_varbintohexstr(CAST(@c AS VARBINARY(MAX))),3,2)
                   + ISNULL(NULLIF(SUBSTRING(sys.fn_varbintohexstr(CAST(@c AS VARBINARY(MAX))),5,2), '00'), '')
         END
        SET @i = @i +1
     END
    RETURN @urlReturn
END

6
2018-05-25 14:45



Personnellement, je le ferais dans l'application plutôt que dans la base de données - mais si vous devez le faire pour une raison quelconque et que vous pouvez activer l'intégration du CLR, ce serait un candidat idéal pour CLR UDF. Ce serait plus simple que d'essayer de le faire en SQL et probablement plus fiable et performant.

Il y a INET_URIEncode et INET_URIDecode fonctions dans la version gratuite du Bibliothèque d'extension SQLsharp T-SQL CLR. Il gère également Unicode, même si vous avez besoin de la version payante pour gérer les versions non standard. %uXXYY codage.


4
2017-07-17 22:48



Daniel Hutmacher de SQL Sunday a fourni une belle fonction.
https://sqlsunday.com/2013/04/07/url-encoding-function/

CREATE FUNCTION dbo.fn_char2hex(@char char(1))
RETURNS char(2)
AS BEGIN

    DECLARE @hex char(2), @dec int;
    SET @dec=ASCII(@char);
    SET @hex= --- First hex digit:
             SUBSTRING('0123456789ABCDEF', 1+(@dec-@dec%16)/16, 1)+
              --- Second hex digit:
             SUBSTRING('0123456789ABCDEF', 1+(     @dec%16)   , 1);
    RETURN(@hex);
END

CREATE FUNCTION dbo.fn_UrlEncode(@string varchar(max))
RETURNS varchar(max)
AS BEGIN
    DECLARE @offset int, @char char(1);
    SET @string = REPLACE(@string, '%', '%' + dbo.fn_Char2Hex('%'));
    SET @offset=PATINDEX('%[^A-Z0-9.\-\%]%', @string);
    WHILE (@offset!=0) BEGIN;
        SET @char = SUBSTRING(@string, @offset, 1);
        SET @string = REPLACE(@string, @char, '%' + dbo.fn_Char2hHx(@char));
        SET @offset = PATINDEX('%[^A-Z0-9.\-\%]%', @string);
    END
    RETURN @string;
END;

1
2017-12-08 17:29



Pour utiliser ce script, vous devez utiliser le tableau Numbers.

CREATE FUNCTION [dbo].[URLEncode] 
    (@decodedString VARCHAR(4000))
RETURNS VARCHAR(4000)
AS
BEGIN
/******
*       select dbo.URLEncode('K8%/fwO3L mEQ*.}')
**/

DECLARE @encodedString VARCHAR(4000)

IF @decodedString LIKE '%[^a-zA-Z0-9*-.!_]%' ESCAPE '!'
BEGIN
    SELECT @encodedString = REPLACE(
                                    COALESCE(@encodedString, @decodedString),
                                    SUBSTRING(@decodedString,num,1),
                                    '%' + SUBSTRING(master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(1),ASCII(SUBSTRING(@decodedString,num,1)))),3,3))
    FROM dbo.numbers 
    WHERE num BETWEEN 1 AND LEN(@decodedString) AND SUBSTRING(@decodedString,num,1) like '[^a-zA-Z0-9*-.!_]' ESCAPE '!'
END
ELSE
BEGIN
    SELECT @encodedString = @decodedString 
END

RETURN @encodedString

END
GO

Le script est entièrement disponible sur SQL Server Central (enregistrement requis)


-9
2018-05-25 20:52