2012-03-14 105 views
2

問題是我們有許多不同的錯誤消息正在生成並存儲在sql表中 錯誤消息中可能是項目編號爲8個字符長的項目的發生 其中至少包含1個數字爲字母數字且不包含空格。每個錯誤消息的項目編號可能不一樣。T-SQL找到一個八字符的字符串,其中不包含空格,並且至少包含一個字符串中的數字,並排除它

例如

'error found processing project: abcd12sf no funding is set' 
'error found processing project: qd451srf no funding is set' 
'error project 2344ddrf has no approver' 

我們希望能算特定錯誤的occurances,所以我們需要從輸出

從而

'error found processing project: no funding is set' , 2 occurances 
'error project has no approver' , 1 occurance 

任何幫助是極大的讚賞

剝離項目數量
+0

我建議對錯誤消息使用一致的樣式。事實上,沒有辦法確定錯誤消息的哪一部分是錯誤代碼(除非您可以**保證只包含數字字符的8個字符的字符串始終是錯誤代碼),因此問題如上所述無法解決。 – 2012-03-14 10:27:14

+0

如果生活只是這麼簡單......但對於這個練習,我們可以保證只有8個字符的字符串包含數字代碼將永遠是'項目編號',我們需要刪除 – user641399 2012-03-14 10:37:16

+0

可以有更多每行中有1個以上的項目? – 2012-03-14 14:04:38

回答

1

開始通過創建返回的項目數的函數。我通過找到第一個整數然後找到後面的空格位置來完成此操作,然後計算返回8個字符的起始位置和結束位置。

CREATE FUNCTION GetProjectNumber(@FullErrorMessage varchar(100)) 

RETURNS CHAR(8) 

AS 

BEGIN 

    DECLARE @ProjectNumber CHAR(8) 

    SET @ProjectNumber = (
            SELECT 
            SUBSTRING(@FullErrorMessage, CHARINDEX(' ',@FullErrorMessage,PATINDEX('%[0-9]%',@FullErrorMessage))-8,8) 
           ) 

    RETURN @ProjectNumber 
END 

改變你的表有一個名爲ProjectNumber的計算列這裏是我爲測試做的創建,但你應該明白了。

CREATE TABLE T_Errors(
ID int IDENTITY(1,1), 
ErrorMessage varchar(1024), 
ProjectNumber AS (dbo.GetProjectNumber(ErrorMessage)) 
CONSTRAINT PK_T_Errors PRIMARY KEY CLUSTERED(ID)) 

現在,您將項目編號放在單獨的列中,很容易操作。

SELECT 
CleanErrorMessage = REPLACE(ErrorMessage,ProjectNumber,''), 
COUNT(*) As ErrorCount 
FROM T_Errors 
GROUP BY REPLACE(ErrorMessage,ProjectNumber,'') 
+0

完美 - 謝謝-SELECT SUBSTRING(@FullErrorMessage,CHARINDEX('',@ FullErrorMessage,PATINDEX('%[0-9]%',@ FullErrorMessage)) - 8,8) – user641399 2012-03-14 14:10:44

0

如果你有一個有效的項目編號列表,你可以做這樣的事情。

示例表和數據:

declare @Project table 
(
    ProjectNumber char(8) 
) 

insert into @Project values 
('abcd12sf'), 
('qd451srf'), 
('2344ddrf') 

declare @Error table 
(
    Error varchar(100) 
) 

insert into @Error values 
('error found processing project: abcd12sf no funding is set'), 
('error found processing project: qd451srf no funding is set'), 
('error project 2344ddrf has no approver') 

查詢:

select P.Error, 
     count(*) as ErrorCount 
from @Error as E 
    cross apply 
    (
     select replace(E.Error, P.ProjectNumber, '') as Error 
     from @Project as P 
     where E.Error like '%'+P.ProjectNumber+'%' 
    ) as P 
group by P.Error 

結果:

Error            ErrorCount 
-------------------------------------------------- ---------- 
error found processing project: no funding is set 2 
error project has no approver      1 
+0

不幸的是,我們沒有知道項目編號的列表 - 我們正在考慮在字符串中搜索一個數字 - 然後找到下一個空格字符pos - 找到上一個空格字符pos - 如果差異是8,我們發現項目並相應地進行操作。我猜這是有效的? – user641399 2012-03-14 11:43:56

+0

我有一個更好的方式掛在幾分鐘。 – 2012-03-14 13:22:05

相關問題