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

时间:2012-06-12 15:39:55

标签: sql-server sql-server-2008 tsql

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

有人可以给我一个基本触发器来检查是否fldType = 'INVALID',如果是,它会将另一列errInvalid设置为1

请记住,每天会插入5000行(在一次点击中),因此性能是个问题。我在其他地方看过,但只是感到困惑。

好的,我的问题已经发展了。我已经推倒了Persisted Colums路线。我已经创建了一个成功的基本持久化字段,但是遇到了嵌套逻辑pf。

的问题

我可以(以及如何)执行以下操作:

情况下    当[MissCustName]为真时       当[CustomerAccountName]为NULL时          (1)       其他          (0)    结束 其他    (0) 端

5 个答案:

答案 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
)