2010-09-30 18 views
10

Potrzebuję wykonać kwerendę przeciwko starszej tabeli, która przechowuje tekst zakodowany w adresie URL. Potrzebuję tego tekstu do odkodowania w moich wynikach. Jak to osiągnąć?Dekodowanie adresu URL serwera SQL

+0

Jeśli używasz języka programowania, aby uruchomić kwerendę, to chyba najłatwiejszy do URL zakodować zapytania, jak również. –

Odpowiedz

20

Wypróbuj jedno z nich:

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 

z 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 

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

+0

Poszedł z pierwszym ogniwem. Ty, mój przyjacielu, oszczędzasz życie. Dzięki! –

0

kodu nie jest praca dla mnie .... Oto mój kod:

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` 

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