1

我只想从中提取电子邮件

违反 UNIQUE KEY 约束“UQ_Email”。无法在对象“dbo.User”中插入重复键。重复键值为 (name.surname@email.com)。该语句已终止。

DescriptionError列中。

在 C# 中,这是几行代码,但我想知道是否可以仅使用T-SQL内置函数捕获(name.surname@email.com)部分。

我试过的:

SELECT SUBSTRING(DescriptionError,NULLIF(PATINDEX('%@email.com)%',DescriptionError) - 15,1),35) 
as UserEmail
FROM ErrorLog
order by DateInserted desc

这可行,但我必须猜测开始/结束长度。

更新:

需要明确的是,DescriptionError列包含各种错误日志(正如错误日志表所预期的那样),括号内的值与电子邮件不同。

4

2 回答 2

0

Like模式相当有限,这是寻找的一种天真的方法

一个括号 > 至少一个字符 > @ > 域以 az/0-9 开头 > 更多字符 > 句点 > tld 和 2 个 az > 更多字符 > 括号

create function udfTryGetEmail(@value varchar(1024)) returns varchar(64) as begin
   declare @pos int = 1 + patindex('%(_%@[0-9A-Z]%.[A-Z][A-Z]%)%', @value)
   if @pos = 1
      return ''

   return substring(@value, @pos, charindex(')', @value, @pos) - @pos)
end

select dbo.udfTryGetEmail(DescriptionError) ...
于 2013-04-05T10:57:38.117 回答
0

您可以使用 CHARINDEX。尝试这个:

-- 寻找起点

DECLARE @Start INT

SELECT @Start = CHARINDEX('(', DescriptionError, 0) 
FROM ErrorLog

--找到终点

DECLARE @End INT

SELECT @End = CHARINDEX(')', DescriptionError, 0) 
FROM ErrorLog

如果您真的想使用正则表达式,阅读您的更新后,我会阅读这篇文章: https ://www.simple-talk.com/sql/t-sql-programming/tsql-regular-expression-workbench/

于 2013-04-04T16:01:27.820 回答