2010-09-30 17 views
10

Necesito ejecutar una consulta en una tabla heredada que almacena el texto codificado en la URL. Necesito que este texto sea decodificado en mis resultados. ¿Cómo logro esto?Descodificación de URL del servidor SQL

+0

Si está utilizando un lenguaje de programación para ejecutar la consulta, es probable que sea más fácil de codificar URL de la consulta de búsqueda también. –

Respuesta

20

probar uno de estos:

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 
GO 

de http://sqlblog.com/blogs/peter_debetta/archive/2007/03/09/t-sql-urldecode.aspx


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 = 'abcdef', 
     @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 

de http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=88926

+0

Fuimos con el primer enlace. Tú mi amigo, eres un salvavidas. ¡Gracias! –

0

El código no es trabajo para mí .... Aquí mi código:

create function [UrlDecode](@url nvarchar(max)) 
returns nvarchar(max) 
as 
begin 

    declare @output nvarchar(max), @C nvarchar(255), @C1 nvarchar(255), @C2 nvarchar(255), @IsUrl int 

    set @output = '' 

    declare @T table(I int identity(1,1), C nvarchar(255)) 
    insert @T(C) 
    select items from dbo.Split(@url,'%') 

    set @IsUrl = charindex('%', @url) 

    declare cur cursor for select C from @T order by I 
    open cur 
    fetch next from cur into @C 
    while @@fetch_status = 0 begin 
     set @C1 = substring(@C, 2, 4) 
     set @C2 = substring(@C, 6, 255) 
     if substring(@C, 1, 1) = 'u' and @IsUrl <> 0 begin 
      if @C1 is not null 
       set @output = @output + char((CONVERT(INT,CONVERT(VARBINARY(4),@C1,2)))-1264) 
      if @C2 is not null 
       set @output = @output + @C2 
     end else begin 
      set @output = @output + isnull(substring(@C, 1, 255),'') 
     end 
     fetch next from cur into @C 
    end 
    close cur 
    deallocate cur 

    return @output 
end` 

La función "Split":

create function [Split](@String nvarchar(max), @Delimiter char(1))  
returns @temptable table (items nvarchar(max))  
as  
begin  
    set @String = ltrim(rtrim(@String)) 
    declare @idx int  
    declare @slice nvarchar(max)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 
0
create function [dbo].[URLDecode](
    @str nvarchar(max) 
) returns nvarchar(max) 
begin 
    if @str is null return null 
    declare @out nvarchar(max) = N'' 
    set @str = replace(@str, N'+', N'%20') 
    while len(@str) > 0 
    begin 
     declare @i bigint = patindex(N'%[%][0-9a-fA-F][0-9a-fA-F]%', @str) 
     if @i = 0 break 
     set @out = @out + substring(@str, 0, @i) + convert(nchar(2), convert(varbinary, '0x' + substring(@str, @i + 1, 2), 1)) 
     set @str = substring(@str, @i + 3, len(@str)) 
    end 
    return @out + @str 
end 
Cuestiones relacionadas