如果您不能使用计算列(John 的建议是实际更改表的定义以使 fname 和 lname 计算列(持久)会更好。然后您可以填充 fullname 而不必担心处理 fname 和名字。
例如
use tempdb
go
create table dbo.Customers(
id INT PRIMARY KEY CLUSTERED,
fname as LTRIM(RTRIM(SUBSTRING(fullname, 0, CHARINDEX(' ', fullname)))) persisted,
lname as LTRIM(RTRIM(SUBSTRING(fullname, CHARINDEX(' ', fullname)+1, 8000))) persisted,
fullname varchar(512)
);
insert into dbo.Customers (Id,fullname) values(1,'Amie Dann');
insert into dbo.Customers (Id,fullname) values(2,'John Hamm');
insert into dbo.Customers (Id,fullname) values(3,'Charlie Key');
select * from dbo.Customers
这是一个触发器示例,请注意我使用了 a 而不是触发器,因此您不必执行两次插入/更新。
use tempdb
go
create table dbo.Customers(
id INT PRIMARY KEY CLUSTERED,
fname varchar(256),
lname varchar(256),
fullname varchar(512)
);
CREATE TRIGGER dbo.trg_dbo_Customers
on dbo.Customers
instead of insert,update
AS
begin
IF exists(select 1 from deleted)
BEGIN
UPDATE c
SET fullname = i.fullname,
fname = LTRIM(RTRIM(SUBSTRING(i.fullname, 0, CHARINDEX(' ', i.fullname)))),
lname = LTRIM(RTRIM(SUBSTRING(i.fullname, CHARINDEX(' ', i.fullname)+1, 8000)))
FROM dbo.Customers c
INNER JOIN inserted i
ON i.id = c.id
INNER JOIN deleted d
ON i.id = d.id
END
ELSE
BEGIN
INSERT INTO dbo.Customers (id,fullname,fname,lname)
SELECT
Id = i.Id,
fullname = i.fullname,
fname = LTRIM(RTRIM(SUBSTRING(i.fullname, 0, CHARINDEX(' ', i.fullname)))),
lname = LTRIM(RTRIM(SUBSTRING(i.fullname, CHARINDEX(' ', i.fullname)+1, 8000)))
FROM inserted i
WHERE not exists(select 1 from dbo.Customers c WHERE i.id = c.id)
END
END
go
insert into dbo.Customers (Id,fullname) values(1,'Amie Dann');
insert into dbo.Customers (Id,fullname) values(2,'John Hamm');
insert into dbo.Customers (Id,fullname) values(3,'Charlie Key');
select * from dbo.Customers