[英]Update / Insert trigger in SQL Server
我是SQL Server和触发器的新手。 我想创建一个触发器,当插入新行或更新现有行时触发。 触发器将更新一组计算的列。
有人可以给我一个基本的触发器来检查fldType = 'INVALID'
,如果是,它将另一个列errInvalid
为1
。
切记每天将插入5000行(一次命中),因此性能是一个问题。 我在其他地方看过,但感到困惑。
好的,我的问题已经演变。 我已经沿着持久哥伦路线走了。 我创建了一个成功的基本持久字段,但是遇到了嵌套逻辑pf的麻烦。
我可以(以及如何)执行以下操作:
如果[MissCustName]为true的情况,则当[CustomerAccountName]为NULL时,则(1)否则(0)结束否则(0)结束
也许更好的选择是改用计算列。
create table myTab
(
fieldType varchar(10),
errInvalid As Case When fieldType = 'INVALID' then 1 else 0 end PERSISTED
)
Go
insert into mytab(fieldType) values ('aaa')
insert into mytab(fieldType) values ('INVALID')
Go
Select * from mytab
您可以按照以下方式使用:
CREATE TRIGGER dbo.trgInsertUpdate
ON dbo.YourTableNameHere
FOR INSERT, UPDATE
AS BEGIN
-- update the column
UPDATE dbo.YourTableNameHere
SET errInvalid = 1
FROM Inserted i
WHERE
dbo.YourTableNameHere.ID = i.ID -- establish link to "Inserted" pseudo-table
AND fldType = 'INVALID'
END
基本上,触发器为每个语句调用一次 ,因此它可能一次应用于多个行。 这些行及其新值存储在Inserted
伪表中,该表包含表中的所有列。
您需要在表中找到fldType = 'INVALID'
那些行,这些行也是Inserted
伪表(已插入或更新的那些表)的一部分。
我想这会做你想要的:
CREATE TRIGGER Trigger1
ON Table1
FOR INSERT, UPDATE
AS
UPDATE t
SET errInvalid = 1
FROM Table1 t
INNER JOIN Inserted i
ON i.id = t.id
WHERE t.fldType = 'INVALID'
您确实想要一个计算列。 它会表现更好。 请参阅此 SO帖子。
CREATE TABLE [dbo].[myTab]
(
[fldType] [varchar](50) NULL ,
[errInvalid] AS ( CASE [fldType]
WHEN 'Invalid' THEN ( 1 )
ELSE ( 0 )
END )
)
为什么不使用“真实”计算列?
例如:
CREATE TABLE foobar
(
fldType varchar(10),
errInvalid AS CASE WHEN fldType = 'INVALID' THEN 1 ELSE 0 END
)
如果您进行大量读取(与“物理”列的级别相当),则使用持久化的计算列可能会提高性能。 只需在列定义后添加PERSISTED
:
CREATE TABLE foobar
(
fldType varchar(10),
errInvalid AS CASE WHEN fldType = 'INVALID' THEN 1 ELSE 0 END PERSISTED
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.