2013-04-04 14 views
1

我想從UNIQUE KEY約束「UQ_Email」的選擇捕獲的值只使用內置在T-SQL

衝突只提取電子郵件。不能在對象 'dbo.User'中插入重複密鑰。重複的鍵值是([email protected])。 該聲明已被終止。

in DescriptionError column。

在C#是的幾行代碼,但我想知道是否有可能趕上只是用T-SQL內置函數僅[email protected]部分。

我曾嘗試:

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

這工作,但我必須猜測的開始/結束長度。

UPDATE:

只是要清楚,DescriptionError列包含各種錯誤日誌(如預期的錯誤日誌表)和括號比電子郵件裏面不同的值。

+0

所以你想解析TSQL中的錯誤消息並提取電子郵件地址?由於地址位於兩個括號之間,爲什麼您需要「猜測」開始/結束位置? – Pondlife 2013-04-04 15:53:11

+0

是的。我知道它在括號之間。你如何在PATINDEX中寫入REGEX來捕獲它? – 2013-04-04 15:57:13

+0

TSQL沒有正則表達式的支持,但你的問題已經在這裏回答了:[如何從特定字符之間的字段獲取子字符串](http://stackoverflow.com/questions/8503345/how-to-take-substring-from-字段之間的特定字符) – Pondlife 2013-04-04 15:58:18

回答

0

您可以使用CHARINDEX。 試試這個:

- 查找起點

DECLARE @Start INT 

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

--Find終點

DECLARE @End INT 

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

,如果你真的想用正則表達式我會讀這個讀您的更新後文章: https://www.simple-talk.com/sql/t-sql-programming/tsql-regular-expression-workbench/

+0

不起作用,並不那麼簡單。查看我的更新。 – 2013-04-05 08:53:07

0

Like模式是相當有限的,這裏是一個天真w^AY尋找

甲括號>至少一個炭> @>域開始的z/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) ...