2013-04-17 63 views
-1

我試圖想出一種方法來更新包含網站訪問的表,包括域和querystrings。由於我無法更新將此數據發送到我們的Web服務的應用程序(並且無法更新),我可以想到的唯一選擇是通過每天運行多次的代理作業來處理此更新。SQL Server:更新包含URL的記錄以刪除querystrings

我一直以編程方式處理這個過程,而我目前的解決方法是簡單地使用子字符串。但如果可能的話,最好的選擇是簡單地刪除querystrings,以便只剩下http://domain.com/

基本上我知道我需要計算完整字符串的字符數,從左到第三個反斜槓(http://something.com/),然後刪除左右字符串中的所有字符。

有沒有人有一些想法,我可以嘗試,迄今爲止,我所有的嘗試都是令人尷尬的失敗。

+0

的URL是'http://something.com/foo .ASP?ID = 1'?你想要結果是「http:// something.com /'還是'http:// something.com/foo.asp'?查詢字符串在技術上是'?',因此標題與描述不匹配。 –

+0

哦,對不起,是的,我忘了包括刪除文件和查詢字符串,所以只列出了域名(和子域)。 – Eric

回答

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) 
+0

哦代理作業是最好的選擇的原因是因爲該表基本上是一個通過web服務更新的日誌文件,計算機只是將數據轉儲爲代碼和代碼文本,其中代碼可以是網站,錯誤,應用程序等等。由於設計錯誤的數據庫存在很多問題,所以我想讓代理腳本運行並分離不同的代碼類型(網站,應用程序等)。所以我想我需要運行更新代理作業,爲什麼不清理垃圾。 – Eric

+0

哦,我不認爲你的迴應會起作用,因爲它聽起來像是對特定URL的查詢正確嗎?我可能沒有清楚我的帖子,但該表充滿了數千個不同的域(域和頁面和querystrings)。基本上我想清理數據,所以我可以在y天訪問x位置的頂級域名上查詢。 – Eric

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會一直有第三個/。)如果