MS SQL触发器之前删除所有

时间:2015-05-29 12:05:41

标签: sql-server triggers

需要一些帮助...

我有一个列,数据显示为 -

USEREMAIL:-USERNAME   
e.g. 
John.smith@test.com:-JSmit                         
janet.smit@test.co.uk:-JanSmit                       
peter.parker@test.ca:-PPark

我需要一个触发器,当添加新条目时,它会自动删除除用户名之外的所有内容。

所以上面的例子就会变成

JSmit
JanSmit
PPark

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

以下是创建所描述的触发器的语法:

测试表:

CREATE TABLE xx(UserName varchar(100))

您必须展开触发器以包含所有列。

触发语法:

CREATE TRIGGER xx_trggr
ON  xx
INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT INTO xx (UserName)
    SELECT stuff(UserName, 1, charindex(':-', UserName) + 1, '')
    FROM inserted
END 
GO

插入数据:

INSERT xx(UserName)
values
('John.smith@test.com:-JSmit'),
('janet.smit@test.co.uk:-JanSmit'),
('peter.parker@test.ca:-PPark')

测试输入:

SELECT UserName FROM xx

结果:

UserName
JSmit
JanSmit
PPark

您可以改为使用AFTER触发器,但这需要一个唯一的键

改为使用此表:

CREATE TABLE xx(id int identity(1,1), UserName varchar(100))

这个触发器:

CREATE TRIGGER xx_trggr
ON  xx
AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE xx
    SET [UserName] = stuff(xx.UserName, 1, charindex(':-', xx.UserName) + 1, '')
    FROM inserted JOIN xx On inserted.id = xx.id
END 

与其他触发器的结果相同。

答案 1 :(得分:0)

这将为您提供

列中的用户名
SET columnName= select SUBSTRING( columnName, CHARINDEX('-',columnName)+1 , LEN(columnName))

在触发器

中使用它

编辑1 :(如果您担心您的电子邮件可以包含-

 SET columnName= select SUBSTRING( columnName, CHARINDEX(':-',columnName)+2 , LEN(columnName))

答案 2 :(得分:0)

您需要在桌面和触发器主体中创建一个AFTER INSERT触发器,使用下面的内容来删除电子邮件部分

select right('John.smith@test.com:-JSmit',(LEN('John.smith@test.com:-JSmit') - CHARINDEX('-','John.smith@test.com:-JSmit')))