2016-11-05 35 views
0

我创建了如下表:如何改进以下存储过程以验证电子邮件的语法?

CREATE TABLE TBL_EMAIL 
(
    ID INT IDENTITY PRIMARY KEY, 
    EMAIL VARCHAR(25) NOT NULL 
); 

我想创建一个存储过程,以检查是否有新邮件的语法是好的,我只是想掩盖两种可能性,如果此邮件还没有一个“@ “字符如下:

INSERT INTO TBL_EMAIL (EMAIL) 
VALUES ('email.com') 

并且如果该电子邮件还没有相应的点:

INSERT INTO TBL_EMAIL (EMAIL) 
VALUES ('[email protected]') 

我只是想掩盖这种情况下,CR eate一个存储过程时,有一个插入到被激活或更新

CREATE TRIGGER Tr_Verify_Email 
ON TBL_EMAIL 
FOR INSERT,UPDATE 
AS 
BEGIN 

变量声明的同时,还有一些标志知道,如果“@”位于第一位置里面算,

DECLARE @V_COUNT INT,@FLAG INT 
    DECLARE @V_EMAIL_INSERTED VARCHAR(25) 
    SET @V_COUNT = 1 
    SET @FLAG = 0 
    SELECT @V_EMAIL_INSERTED = EMAIL FROM INSERTED; 

    WHILE(@V_COUNT < LEN(@V_EMAIL_INSERTED)) BEGIN 
     IF(SUBSTRING(@V_EMAIL_INSERTED,@V_COUNT,1)='@' AND @V_COUNT > 4) BEGIN 
      SET @FLAG = @FLAG + 1 
     END 
     SET @V_COUNT = @V_COUNT + 1 
    END 

回滚事务时使用的电子邮件和“@”在第一位置,

IF(@FLAG <> 1) BEGIN 
     RAISERROR('Invalid Email',16,1) 
     ROLLBACK TRANSACTION 
    END  
END 

然而,这是我第一次的做法,但据我所知,有很多缺失的C Ases和无效的电子邮件,因此我想感谢提高我的逻辑的建议,只允许使用我认为是[email protected]的拨款结构的电子邮件,感谢您的支持。

+0

。 。我修复了标签。凭借您的声誉水平,您应该知道避免不兼容的数据库标记,并将适当的软件放在问题上。 –

+0

对不起,感谢修复,我非常感谢支持。 – neo33

回答

1

请勿使用触发器。正确的方法是check约束:

alter table tbl_email 
    add constraint chk_email_email 
     check (email like '%@%.%'); 

这将确保数据的完整性都插入和更新

+0

感谢这是非常有用的,但我正在练习使用触发器,我想欣赏使用触发器,感谢您的支持。 – neo33

+0

对于您的触发器练习,请确保您测试插入和更新和删除方案。测试一次更新多行,并确保您有一些行不希望在测试中更新。也用空值进行测试。这会给你更好的触发技巧。 –

+0

@SqlSurfer,感谢您的建议,此刻我正在分析DELETED和INSERTED表, – neo33