2

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

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

请记住,每天将插入 5000 行(一次点击),因此性能是一个问题。我在别处看过,但只是感到困惑。

好的,我的问题已经演变。我已经沿着 Persisted Colums 路线行驶。我已经创建了一个成功的基本持久字段,但是在嵌套逻辑 pf 方面遇到了问题。

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

如果 [MissCustName] 为真,则 [CustomerAccountName] 为 NULL,则 (1) else (0) end else (0) end

4

5 回答 5

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
于 2012-06-12T15:51:10.537 回答
1

你真的想要一个计算的列。它会表现得更好。请参阅SO 帖子。

CREATE TABLE [dbo].[myTab]
(
  [fldType] [varchar](50) NULL ,
  [errInvalid] AS ( CASE [fldType]
                      WHEN 'Invalid' THEN ( 1 )
                      ELSE ( 0 )
                    END )
) 
于 2012-06-12T15:52:55.013 回答
1

为什么不使用“真实”计算列?

例如:

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
)
于 2012-06-12T15:54:17.447 回答
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伪表的一部分(那些被插入或更新)。

于 2012-06-12T15:45:55.303 回答
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'
于 2012-06-12T15:46:17.187 回答