我是SQL Server和触发器的新手。我想创建一个触发器,当插入新行或更新现有行时触发。触发器将更新一组计算列。
有人可以给我一个基本触发器来检查是否fldType = 'INVALID'
,如果是,它会将另一列errInvalid
设置为1
。
请记住,每天会插入5000行(在一次点击中),因此性能是个问题。我在其他地方看过,但只是感到困惑。
好的,我的问题已经发展了。我已经推倒了Persisted Colums路线。我已经创建了一个成功的基本持久化字段,但是遇到了嵌套逻辑pf。
的问题我可以(以及如何)执行以下操作:
情况下 当[MissCustName]为真时 当[CustomerAccountName]为NULL时 (1) 其他 (0) 结束 其他 (0) 端
答案 0 :(得分:3)
也许更好的选择是使用计算列代替..
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
答案 1 :(得分:1)
您可以使用以下内容:
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
伪表的一部分(插入或更新了这些行)。
答案 2 :(得分:1)
我认为这会做你想做的事情:
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'
答案 3 :(得分:1)
你真的想要一个计算列。它会表现得更好。见this SO post。
CREATE TABLE [dbo].[myTab]
(
[fldType] [varchar](50) NULL ,
[errInvalid] AS ( CASE [fldType]
WHEN 'Invalid' THEN ( 1 )
ELSE ( 0 )
END )
)
答案 4 :(得分:1)
为什么不使用“真正的”计算列?
e.g:
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
)