【问题标题】:SQL Server : update a record containing URLs to remove querystringsSQL Server:更新包含 URL 的记录以删除查询字符串
【发布时间】:2013-04-17 00:05:36
【问题描述】:

我试图想出一种方法来更新包含网站访问的表,包括域和查询字符串。由于我无法更新将这些数据发送到我们的 Web 服务的应用程序(也无法更新它),我能想到的唯一选择是通过每天运行多次的代理作业来处理此更新。

我一直以编程方式处理这个过程,我目前的解决方法是简单地使用子字符串。但如果可能的话,最好的选择是简单地删除查询字符串,以便只保留http://domain.com/

基本上我知道我需要计算完整字符串的字符数,从左数到第三个反斜杠 (http://something.com/) 的字符数,然后从右-左字符串中删除所有字符。

有没有人有一些我可以尝试的想法,到目前为止我所有的尝试都是令人尴尬的失败。

【问题讨论】:

  • 如果 URL 是http://something.com/foo.asp?id=1 怎么办?您希望结果为http://something.com/ 还是http://something.com/foo.asp?查询字符串在技术上是?,因此标题与描述并不匹配。
  • 哦,对不起,是的,我忘了包括删除文件和查询字符串,所以只列出了域名(和子域)。

标签: sql-server string url dns


【解决方案1】:

IMO,而不是为此运行 SQL 作业,您可以在每次更新时触发的表上编写触发器;当然,如果该表上没有大量更新。在触发器中,您可以获得类似于以下示例的域部分:

declare @url varchar(max), @index int
set @url = 'http://myurl.com/?q1=dummy&q2=dummy2&q3=dummy3'

set @index = case 
                when patindex('%?%', @url) = 0 then LEN(@url) 
                else patindex('%?%', @url) 
             end
select LEFT(@url, @index - 1)

【讨论】:

  • 哦,代理作业是最佳选择的原因是因为该表基本上是一个通过网络服务更新的日志文件,计算机只需将数据转储到代码和代码文本中,其中代码可以是网站、错误、应用程序等。长话短说,由于设计糟糕的数据库存在许多问题,我希望运行一个代理脚本并将不同的代码类型(网站、应用程序等)分开。所以我想我还是需要运行一个更新代理作业,为什么不清理垃圾呢。
  • 哦,我认为您的回复不会起作用,因为这听起来像是对特定 URL 的查询,对吗?我的帖子可能不清楚,但该表充满了数千个不同的域(域、页面和查询字符串)。基本上我想清理数据,这样我就可以查询 y 天在 x 位置访问的顶级域。
【解决方案2】:

为什么不直接创建视图,而不是不断更新数据?没有理由必须不断运行作业来去除无关信息 - 然后对它的查询只会在作业运行后立即进行。

CREATE TABLE dbo.example(URL NVARCHAR(2048));
GO

INSERT dbo.example(URL) 
           SELECT 'http://somesite.com/foo.asp?id=1'
 UNION ALL SELECT 'http://someothersite.com/';
GO

CREATE VIEW dbo.view_example
AS
  SELECT URL, StrippedURL = LEFT(URL, pos+1) + 
    SUBSTRING(URL, pos+2, CHARINDEX('/', URL, pos+2)-pos-1)
  FROM 
  (
    SELECT URL, CHARINDEX('//', URL) AS pos
      FROM dbo.example
  ) AS x;
GO

SELECT URL, StrippedURL FROM dbo.view_example;

结果:

URL                               StrippedURL
--------------------------------  -------------------------
http://somesite.com/foo.asp?id=1  http://somesite.com/
http://someothersite.com/         http://someothersite.com/

(请注意,当前的计算假设您的网址总是有第三个/。)

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多