2017-06-01 72 views
1

之後刪除電子郵件我有一個觸發器,用於檢查電子郵件的域是否存在於另一個表(域)中。SQL觸發器在@

表用戶:

+------------------+ +------------------+ 
| email   | | domain   | 
+------------------+ +------------------+ 
| [email protected] | | gmail.com  | 
| [email protected] | | live.com   | 
| [email protected]| |------------------| 
|------------------| 

觸發是:

IF EXISTS ( 
      SELECT 1 
      FROM [USER] AS U INNER JOIN inserted AS I 
      ON U.EMAIL = I.EMAIL 
      WHERE REPLACE(RIGHT(U.EMAIL, CHARINDEX('@', U.EMAIL)-2),'_',' ') NOT IN (
       SELECT DOMAIN_NAME 
       FROM ALLOWED_DOMAIN 
      ) 
     ) 

觸發正確好好嘗試的工作,所以我拼命地跑下面的查詢:

select REPLACE(RIGHT(U.EMAIL, CHARINDEX('@', U.EMAIL)-2),'_',' '), EMAIL 
from [USER] U 

這樣做具有以下結果:

| unknown  | email   | 
+----------------|--------------- | 
| gmail.com  | [email protected] | 
| ive.com  | [email protected] | 
| [email protected] | [email protected]| 
+----------------|------------------| 

現在看起來觸發器將第一條記錄中的字符數量應用於表中的所有記錄...... 如何修復觸發器以使其可以工作多行?

+0

請檢查我的答案 – maSTAShuFu

+0

'RIGHT(U.EMAIL,LEN (u.email) - CHARINDEX('@',U.EMAIL))'將給域的部分 – Serg

+0

以及相反,而不會得到字符串的長度 – maSTAShuFu

回答

2

試試這個正確的說法

drop table if exists dbo.Email; 


create table dbo.Email (
    email varchar(100) 
); 


insert into dbo.Email (email) 
values ('[email protected]') 
, ('[email protected]') 
, ('[email protected]') 

select 
    RIGHT(U.EMAIL, len(u.email) - CHARINDEX('@', U.EMAIL)) 
from dbo.Email u 
+0

這工作謝謝 – Jelle

1

您可以使用SUBSTRING

DECLARE @Val NVARCHAR(100) = '[email protected]' 
SELECT SUBSTRING(@Val, CHARINDEX('@', @Val, 0) + 1, 1000) -- outlook.com 

@字符後,您可以返回全部字符。

2

這應該是利用反向和右

declare @email as varchar(max) = '[email protected]' 

select REPLACE(Right(@email, CHARINDEX('@', reverse(@email))-1),'_',' ') 
2

的問題是,你正在使用CHARINDEX發現從一開始的距離的字符串,然後使用它從RIGHT函數中字符串的末尾進行計數。

您將需要從字符串的長度減去數這樣

select REPLACE(RIGHT(U.EMAIL,Len(U.Email) - CHARINDEX('@', U.EMAIL)),'_',' '), EMAIL 
From [User] U 

或者只是

select RIGHT(U.EMAIL,Len(U.Email) - CHARINDEX('@', U.EMAIL)), EMAIL 
from [USER] U 
1
declare @email varchar(50) = '[email protected]' 
select SUBSTRING(@email, CHARINDEX('@' ,@email) +1 , Len(@email) - CHARINDEX(@email,'@'))