T-SQL找到一个八字符的字符串,其中不包含空格,并且至少包含一个字符串中的数字,并排除它

问题描述:

问题是我们有许多不同的错误消息正在生成并存储在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

开始通过创建返回的项目数的函数。我通过找到第一个整数然后找到后面的空格位置来完成此操作,然后计算返回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

如果你有一个有效的项目编号列表,你可以做这样的事情。

示例表和数据:

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