1

我在 t-sql 中有一个表,其中包含三列和如下所示的数据

fname  lname  fullname

              Amie Dann
              John Hamm
              Charlie Key

我创建了这个 t-sql 脚本来在同一个表的列中插入数据fnamelnamefullname

INSERT INTO [dbo].[profile] (fname)
LTRIM(RTRIM(SUBSTRING(name, 0, CHARINDEX(' ', fullname)))) As FName
FROM [dbo].[profile]

INSERT INTO [dbo].[profile] (lname)
LTRIM(RTRIM(SUBSTRING(name, CHARINDEX(' ', fullname)+1, 8000)))As LName
FROM [dbo].[profile]

fullname上面的脚本将值从列插入到fnamelname一个表的列。结果写在下面:

firstname  lastname  fullname

Amie       Dann       Amie Dann
John       Hamm       John Hamm
Charlie    Key        Charlie Key

我是创建触发器的新手。每当有人更改任何值或在同一个表的列中添加新值时,如何创建触发并在表的列中添加或更新值的fname触发器?lnamefullname

4

2 回答 2

0

我会查看计算列而不是触发器。

来自 MSDN 的链接

我怀疑你的语法是:

ALTER TABLE [dbo].[profile] ADD [lname] AS LTRIM(RTRIM(SUBSTRING(name, CHARINDEX(' ', fullname)+1, 8000)))

我可能会考虑使用 LEN 函数来确定所需的完整长度,而不是使用 8000。

于 2013-07-12T18:22:14.977 回答
0

如果您不能使用计算列(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
于 2013-07-12T19:35:39.463 回答