-1

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

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

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

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

4

2 回答 2

0

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)
于 2013-04-17T00:30:59.000 回答
0

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

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/

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

于 2013-04-17T00:32:10.467 回答