2014-04-23 35 views
2

我正在將我的日誌導出到SQL。問題在於如果日誌API的長度超過800個字符,並且使用該消息的其餘部分創建新條目,則日誌API將修剪消息列。我使用logparser將這些數據直接導出到SQL中。因此,對於剩下的討論,讓我們假設我必須在SQL中解決這個問題。合併SQL中連續行中特定列的值

這就是SQL表看起來像

ID Timestamp EventID Message 
1  2014-04-23 abcd "Some message"  

如果消息字符數超過800,我們將有一個新的行與開始與信息表「...」的原始行將以「...」結尾,以表示將來還會有更多。

例如

ID  Timestamp EventID Message 
1  2014-04-23 abcd "Some message..." 
2  2014-04-23 abcd "...More message..." 
3  2014-04-23 abcd "...Even More message"  

注意,屬於一個整體是連續的消息的ID的。沒有其他保證。時間戳保證是相同的分裂但不是截然不同的意思,表中可能有其他條目具有相同的時間戳。 eventID也一樣。

問題
鑑於在表中該數據,我想創建其中縫線像這些信息彙集成一個單一的統一的信息的圖。所以用戶永遠不必知道在幕後發生的裁剪。

結果應該是這樣的

ID Timestamp EventID Message 
1  2014-04-23 abcd "Some message More message even more message" 
+0

如果郵件合法地包含字符串'...'會怎麼樣? – bd33

+0

如果我們有一條以「...」結尾的消息,那麼日誌API會放置一個附加的「...」。這同樣會去SQL。這隻有當信息超過800個字符時,字符798,799和800恰好是''。 – Sushant

+0

看起來您正在尋找TSQL字符串聚合。看看這是否有幫助:http://codecorner.galanter.net/2009/06/25/t-sql-string-aggregate-in-sql-server/ –

回答

0

測試數據

DECLARE @TABLE TABLE(ID INT,[Timestamp] DATE,EventID VARCHAR(20),[Message] VARCHAR(800)) 
INSERT INTO @TABLE VALUES 
(1,  '2014-04-23', 'abcd', 'Some message...'), 
(2,  '2014-04-23', 'abcd', '...More message...'), 
(3,  '2014-04-23', 'abcd', '...Even More message'), 
(1,  '2014-04-23', 'abcE', 'Some other message...'), 
(2,  '2014-04-23', 'abcE', '...other More message...'), 
(3,  '2014-04-23', 'abcE', '...other Even More message') 

查詢

SELECT t.EventID 
     ,t.[Timestamp] 
     ,REPLACE(STUFF((
      SELECT ' ' + [Message] 
      FROM @TABLE 
      WHERE EventID = t.EventID 
      ORDER BY ID ASC 
      FOR XML PATH(''),TYPE) 
      .value('.','NVARCHAR(MAX)'),1,2,''), '...', '') AS [Message] 

FROM @TABLE t 
GROUP BY t.EventID ,t.[Timestamp] 

結果集中所有的

╔═════════╦════════════╦══════════════════════════════════════════════════════════════╗ 
║ EventID ║ Timestamp ║       Message       ║ 
╠═════════╬════════════╬══════════════════════════════════════════════════════════════╣ 
║ abcd ║ 2014-04-23 ║ Some message More message Even More message     ║ 
║ abcE ║ 2014-04-23 ║ Some other message other More message other Even More message║ 
╚═════════╩════════════╩══════════════════════════════════════════════════════════════╝ 
+1

這看起來很酷。但是當消息只是一個簡單的消息(少於800個字符)時,它並不處理這種情況。此外,這是將所有事件ID組合成單個消息,這不是我想要的。想象一下,表中其他地方有eventID爲「abcd」的條目。它也會連接這些消息。 – Sushant

+0

看完你的評論後,我會建議你看看你的模式,它需要認真的關注。你的陳述'所有我能保證的是連續的ID',但是sql server並不保證它的本質。行的順序在sql server中是irelavent,除非你有一個值(Column)能夠唯一標識引用一個行的一組行消息有沒有辦法可以保證當你拉動數據時,sql server會根據某些順序考慮行的順序。 –

2

首先檢查「消息」列的列長度在表格中。

在我看來,你可以在兩種選擇中選擇一種。

選項1: 運行SQL腳本,每天,將創建由所有消息在「消息」柱結合一定時間戳&的EventID中的單個條目。

(我假設SQL Server,但我肯定有一些其他等值RDBMS)

select Timestamp,EventID, 
    CombinedMessage((SELECT Message + ' ' 
     FROM table t2 
     where t2.Timestamp = t1.Timestamp 
      and t2.EventID = t1.EventID 
     FOR XML PATH('')),1,1,'') 
from table t1 
into [NewTable] 
group by Timestamp,EventIDenter code here 

是的,我建議創建一個新表將包含您所需的數據。 可以使用Windows Shell腳本或批處理腳本(取決於您的環境)調用此SQL腳本,然後可以使用Windows Scheduler調度該腳本。

選項2: 在我工作的地方,我寫在C#中的應用程序,將使用日誌分析器網絡日誌裝入每天晚上一個數據庫表,然後對導入的數據執行我們的項目的具體後續處理進入桌子。在您的應用程序

使用下面的查詢來創建一個數據集,

SELECT t.Timestamp, t.EventID, t.Message, 
    ROW_NUMBER() OVER(PARTITION BY t.EventID ORDER BY t.Timestamp) rownumber 
FROM theTable t 

現在:那麼同樣,導入數據到表後,你可以創建一個簡單的控制檯應用程序,會做一些如下,

For Each rowNumber in [data set] 
{ 
    1. concatenate Message 
    2. Insert into your original table the combined message record 
    3. Calculate the MAX(LEN(Message)) and delete all other entries 
    whose message is less than MAX(LEN(Message)). 
    You are now left with only one entry for a certain Timestamp, EventID & Message 
} 

希望以上提供的信息有所幫助。

相關問題