繁体   English   中英

在SQL Server中更新/插入触发器

[英]Update / Insert trigger in SQL Server

我是SQL Server和触发器的新手。 我想创建一个触发器,当插入新行或更新现有行时触发。 触发器将更新一组计算的列。

有人可以给我一个基本的触发器来检查fldType = 'INVALID' ,如果是,它将另一个列errInvalid1

切记每天将插入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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM