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
任何帮助是极大的赞赏
剥离项目数量
开始通过创建返回的项目数的函数。我通过找到第一个整数然后找到后面的空格位置来完成此操作,然后计算返回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,'')
完美 - 谢谢-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
不幸的是,我们没有知道项目编号的列表 - 我们正在考虑在字符串中搜索一个数字 - 然后找到下一个空格字符pos - 找到上一个空格字符pos - 如果差异是8,我们发现项目并相应地进行操作。我猜这是有效的? – user641399 2012-03-14 11:43:56
我有一个更好的方式挂在几分钟。 – 2012-03-14 13:22:05
我建议对错误消息使用一致的样式。事实上,没有办法确定错误消息的哪一部分是错误代码(除非您可以**保证只包含数字字符的8个字符的字符串始终是错误代码),因此问题如上所述无法解决。 – 2012-03-14 10:27:14
如果生活只是这么简单......但对于这个练习,我们可以保证只有8个字符的字符串包含数字代码将永远是'项目编号',我们需要删除 – user641399 2012-03-14 10:37:16
可以有更多每行中有1个以上的项目? – 2012-03-14 14:04:38